【NOIP1999】【Luogu1020】导弹拦截

problem

solution

codes

//多少个最长不上升子序列可以覆盖这个数列,其实是等效于最长上升子序列的长度
#include<iostream>
#include<algorithm>
using namespace std;
int n, h[50], k[50], ans1, ans2 = 1;
int dp1[50], dp2[50], maxn;
int main(){
    while(cin>>h[n]) n++; 
    dp1[0] = 1; dp2[0] = 1; k[0] = h[0];
    for(int i = 1; i < n; i++){
        //DP1
        maxn = 0;
        for(int j = 0; j < i; j++)
            if(h[j]>=h[i])maxn = max(maxn, dp1[j]);
        dp1[i] = maxn+1;
        ans1 = max(ans1, dp1[i]);
        //DP2
        maxn = 0;
        for(int j = 0; j < i; j++)
            if(h[j]<=h[i])maxn = max(maxn, dp2[j]);
        dp2[i] = maxn+1;
        ans2 = max(ans2, dp2[i]);
    }
    cout<<ans1<<"\n"<<ans2;
    return 0;
}
posted @ 2018-05-23 12:15  gwj1139177410  阅读(158)  评论(0编辑  收藏  举报
选择