博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
华为OJ-合唱队
阅读量:5304 次
发布时间:2019-06-14

本文共 2118 字,大约阅读时间需要 7 分钟。

华为OJ-初级题-合唱队

 

思路与分析

  本题可以用DP的方法,分别从正向和逆向的两个方向求,该数组即186 186 150 200 160 130 197 200的上升对大序列。正向为[1, 1, 1, 2, 2, 1, 3, 4],逆向为[3, 3, 2, 3, 2, 1, 1, 1]。

然后将两个序列相加取最大值为5,根据题意出列的人数为N -(5 - 1)。注:减去1的原因是为中间的数被正序和逆序加了两次。

  第一次做这种题表示很蒙蔽<`_`>~那么下面是源码。

本题参考代码

1 import java.util.Arrays; 2 import java.util.Scanner; 3 /** 4  * 合唱队 5  * array[]:待处理数据 6  * Inc[]:正向遍历得到上升的最大序列 7  * Dec[]:逆向遍历得到上升的最大序列 8  *  9  * Created by Evan on 2016-8-29.10  */11 public class ChorusDp {12     13     public static void main(String []args){14         Scanner sc = new Scanner(System.in);15         while(sc.hasNext()){16             int N = sc.nextInt();17             int [] array = new int [N];18             int [] Inc = new int [N];19             int [] Dec = new int [N];20             for( int i = 0; i < N;i++){21                 array[i] = sc.nextInt();22             }23             //正向遍历得到上升的最大序列的个数是多少,本题为[1, 1, 1, 2, 2, 1, 3, 4]24             25             Inc[0] = 1;26             for( int i = 1; i < N ; i++){27                 Inc[i] = 1;28                 for( int j = 0 ; j < i;j++){29                     if(array[i] > array[j] && Inc[j] + 1 > Inc[i]){30                         Inc[i] = Inc[j] + 1;31                     }32                 }33             }34             //System.out.println(Arrays.toString(Inc));35             //逆向最长上升序列的个数,本题为[3, 3, 2, 3, 2, 1, 1, 1]36             Dec[N - 1] = 1;37             for(int i = N - 2; i >=0; i--){38                 Dec[i] = 1;39                 for(int j = N - 1; j > i; j--){40                     if(array[i] > array[j] && Dec[j] + 1 > Dec[i]){41                         Dec[i] = Dec[j] + 1;42                     }43                 }44             }45             //System.out.println(Arrays.toString(Dec));46             int temp = Inc[0] + Dec[0];47             for(int i = 1; i < N ;i++){48                 if(Inc[i] + Dec[i] > temp){49                     temp = Inc[i] + Dec[i];50                 }51             }52             System.out.println(N - temp + 1);//减去1是因为中间的那个数加了两次。53         }54     }55     56 }
合唱队

 

转载于:https://www.cnblogs.com/wen-z/p/5818018.html

你可能感兴趣的文章
好用的性能检测工具 - Glances
查看>>
tcp滑动窗口和读写缓冲区
查看>>
GO 使用静态链接库编译 生成可执行文件 使用第三方 .a 文件,无源码构造
查看>>
ssh 使用指定网卡 连接特定网络
查看>>
鸿蒙操作系统发布会 分析 记录
查看>>
浅谈python 中正则的一些函数
查看>>
app生命周期之即将关闭
查看>>
MPU6050
查看>>
Asp.Net 加载不同项目程序集
查看>>
Jenkins插件--通知Notification
查看>>
思1-基本三观
查看>>
angularJS--apply() 和digest()方法
查看>>
Alpha 冲刺 (5/10)
查看>>
PHP函数之$_SERVER
查看>>
利用安装光盘创建本地yum源补装 RPM 软件包-通过命令行模式
查看>>
XML通過XSD產生CLASS
查看>>
跨线程调用窗体控件
查看>>
linq to sql 扩展方法
查看>>
241. Different Ways to Add Parentheses
查看>>
实验10 编写子程序 1.显示字符串
查看>>