P1020 [NOIP1999 普及组] 导弹拦截

 

 

 

 

 

/*
89 126 85 103 101 86 86 98 96 99 89 81 101 92 79 77 82 97 83 100 78 72 79 97 71 80 98 89 69 74

*/
//12 6 [12,8]
#include <bits/stdc++.h>
#include<iostream>
#include<cstdio>
using namespace std;

const int N = 1e5 + 5;
int a[N], x, l, dp[N], maxn;
int g[N], cnt,ans1,ans2;

int main() {
    
    while (cin>>x){
        
        a[++l] = x;
        if(cin.get()=='\n') break;
    } 
    
    //cin>>x; a[++l]=x;
    /*
    for(int i=1;i<=l;i++) cout<<a[i]<<endl;
    
    for (int i = 1; i <= l; i++) {
        int k = 1;
        while (k <= cnt && g[k] >= a[i]) k++;
        if (k > cnt) g[++cnt] = a[i];
        else g[k] = a[i];
    }
    cout << cnt << endl;
    cnt = 0;
    for (int i = 1; i <= l; i++) {
        int k = 1;
        while (k <= cnt && g[k] < a[i]) k++;
        if (k > cnt) g[++cnt] = a[i];
        else g[k] = a[i];
    }
    cout << cnt << endl;
    */ 
    
//    memset(dp,1,sizeof(dp));//

//    for(int i=1;i<=l;i++) cout<<a[i]<<endl;
    for(int i=1;i<=l;i++) dp[i]=1;
    
    for(int i=2;i<=l;i++)
    {
        for(int j=1;j<=i-1;j++)
        {
            if(a[i]<=a[j]) dp[i]=max(dp[i],dp[j]+1);
        }
    }
    for(int i=1;i<=l;i++) ans1=max(ans1,dp[i]);
    cout<<ans1<<endl;
    
    for(int i=1;i<=l;i++) dp[i]=1;
    
    for(int i=2;i<=l;i++)
    {
        for(int j=i-1;j>=1;j--)
        {
            if(a[i]>a[j]) dp[i]=max(dp[i],dp[j]+1);
        }
    }
    for(int i=1;i<=l;i++) ans2=max(ans2,dp[i]);
    
    cout<<ans2<<'\n';
    
    
}
View Code

 

 

 
posted @ 2023-08-01 18:52  JMXZ  阅读(9)  评论(0)    收藏  举报