joj 2529 Chorus 动态规划 最长上升子序列和最长下降子序列

来源:互联网 发布:动漫恶搞软件 编辑:程序博客网 时间:2024/06/05 08:02

题目链接:http://acm.jlu.edu.cn/joj/showproblem.php?pid=2529

题目大意:给出一个队列的总人数和各自的身高,问最少剔除多少人才能让这个序列从左到 i 为一直增高, 从i 到 有一直变矮,相邻两个不能相等。

Sample Input

8186 186 150 200 160 130 197 220

Sample Output

4

AC程序:

#include "iostream"#include "cstring"using namespace std;#define size 110int main(){//freopen("in.txt", "r", stdin);int n, a[size], up[size], down[size], i, j, max;while(cin>>n){memset(up, 0, sizeof(up));memset(down, 0, sizeof(down));for(i = 1; i <= n; i++)cin>>a[i];//up[i]为1到i可以保留的最大人数up[1] = 1;for(i = 2; i <= n; i++){up[i] = 1;for(j = 1; j < i; j++){if(a[j] < a[i] && up[j] + 1 > up[i]){up[i] = up[j] + 1;}}}//down[i]为i到n可以保留的最大人数down[n] = 1;for(i = n - 1; i >= 1; i--){down[i] = 1;for(j = n; j > i; j--){if(a[j] < a[i] && down[j] + 1 > down[i]){down[i] = down[j] + 1;}}}max = 0;//求可以保留的最大人数for(i = 1; i <= n; i++){if(up[i] + down[i] > max)max = up[i] + down[i];}max--;//对于i算了两次,所以减1cout<<n - max<<endl;}return 0;}


 

原创粉丝点击