题意

  • 有若干导弹,拦截系统只能拦高度降序的一组导弹,问一套系统最多拦截多少导弹,拦截全部导弹需要几套系统

思路

  • 对于第一个问题,直接对整个序列跑一个最长递减子序列(LDS Longest-Decreasing-Subsequence)

  • 对于第二个问题,正解是跑一个最长递增子序列(LIS)

  • 对于第二个问题,证明如下

    记程度n

    首先,至少需要n套系统,是显然可以得到的

    需要证明的是,至多也只需要n套系统,由Dilworth定理可得,一个序列的最少不上升子序列数目就是其LDS长度

AC代码

#include<bits/stdc++.h>
using namespace std;

int a[101010];
int f1[101010];
int f2[101010];
int main(){
    int cnt=1;
    while (cin >> a[cnt++]);
    for(int i=1;i<cnt;i++){
        for(int j=1;j<i;j++){
            if(a[i]<a[j]){
                f1[i]=max(f1[i],f1[j]+1);
            }
        }
    }
    for(int i=1;i<cnt;i++){
        for(int j=1;j<i;j++){
            if(a[i]>a[j]){
                f2[i]=max(f2[i],f2[j]+1);
            }
        }
    }
    int ans1=0,ans2=0;
    for(int i=1;i<cnt;i++){
        ans1=max(ans1,f1[i]); 
        ans2=max(ans2,f2[i]); 
    }
    cout << ans1 << endl << ans2 <<endl;
    return 0;
}