[华为OJ] 合唱团
2016-07-06 09:25
309 查看
思路:
看作最长升序子序列和最长降序子序列的拼接。
取数组中第i个人为合唱团最高的人,则组成合唱队人数为,队列首到位置i 的最长上升子序列长度 + 从位置 i 到队尾的最长下降子序列长度。
代码:
看作最长升序子序列和最长降序子序列的拼接。
取数组中第i个人为合唱团最高的人,则组成合唱队人数为,队列首到位置i 的最长上升子序列长度 + 从位置 i 到队尾的最长下降子序列长度。
代码:
#include <iostream> #include <vector> using namespace std; void getLs(vector<int> nums, int size, vector<int>& ls); void getRs(vector<int> nums, int size, vector<int>& rs); void main(){ int size; cin >> size; if(size == 0 || size == 1) cout << 0; vector<int> input(size,0); for(int i = 0; i < size; i++){ cin >> input[i]; } vector<int> ls(size,1); vector<int> rs(size,1); getLs(input,size,ls); getRs(input,size,rs); int t = 0, index = 0; for(int i = 1; i < size; i++){ if(ls[i] + rs[i] > t){ t = ls[i] + rs[i]; index = i; } } cout << size - ls[index] - rs[index] + 1; } void getLs(vector<int> nums, int size, vector<int>& ls){ for(int i = 1; i < size; i++){ for(int j = 1; j < i; j++){ if(nums[j] < nums[i] && ls[j] + 1 > ls[i]) ls[i] = ls[j] + 1; } } } void getRs(vector<int> nums, int size, vector<int>& rs){ for(int i = size - 1; i >= 1; i--){ for(int j = size - 1; j >= i; j--){ if(nums[i] > nums[j] && rs[j] + 1 > rs[i]) rs[i] = rs[j] + 1; } } }
相关文章推荐
- jquery eval解析JSON中的注意点介绍
- Linux系统库函数 -- lseek函数用法
- android:id="@+id/button1" 与 android:id="@id/button1" 区别 @string
- lseek()函数
- CI持续集成
- APUE 1-3程序,列出一个目录中的所有文件
- 李洪强经典面试题24
- android签名那点事
- ReactiveX-入门篇
- Lync就地升级Skype for Business报错处理一例
- iOS学习(七)Objective-C 存取器方法
- APUE 1-3.c列出一个目录中的所有文件
- MyEclipse2014中如何设置jsp文件打开后显示一个框里两个页面,上面是图,下面是代码
- 高德地图 正向地理编码 逆向地理编码
- mysql5.7 二进制包安装
- String与string的区别
- 李洪强经典面试题23
- 浅谈一类积性函数的前缀和
- IOS实现选择城市后跳转Tabbar效果
- DeepID算法实践