CODE(VS) 1044 导弹拦截 (判断最长递增和最长递减子序列)

来源:互联网 发布:股票持仓软件 编辑:程序博客网 时间:2024/05/29 03:16

这道题和别的不同的是:这次不仅要求出最长递减子序列,还有求出有几个子序列,不是最长递减子序列,那么怎么求有几个最长递减子序列呢?可以转化为求最长递增子序列,如果一个序列他的最长递增子序列为n,那他就一定有n个递减子序列,例如:389 207 155 300 299 170 158 65  ,他的一个最长递增子序列为 155 300, 那么他两个肯定不可能在同一个递减子序列中,如果在一个递减子序列中,那这个子序列就不在是递减子序列了。

下面附上代码:

#include<stdio.h>#include<algorithm>#include<iostream>#include<string.h>using namespace std;int main(){    int a[30], dp1[30], dp2[30], i = 0, ans1 = 0, ans2 = 0;    while(cin>>a[i])    {        int max1 = 0, max2 = 0;       dp1[i] = 1;       dp2[i] = 1;       for(int j = 0; j < i; j++)       {           if(a[i] < a[j] && dp1[j] > max1)  // 最长递减子序列            max1 = dp1[j];           if(a[i] > a[j] && dp2[j] > max2)  // 最长递增子序列            max2 = dp2[j];       }       dp1[i] = max1+1;       dp2[i] = max2+1;       ans1 = max(dp1[i], ans1);       ans2 = max(dp2[i], ans2);       i++;    }    printf("%d\n%d\n", ans1, ans2);}



1 0
原创粉丝点击