AOJ-problem-873

                                                                             拦截导弹

Description

某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。

Input
输入导弹的个数(n<=5000)以及导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数)

Output
计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。

分析:
经典的dp题
第一问:dp[i]=max(dp[i],dp[j]+1) (1<=j<i且a[j]>=a[i])
第二问:
Dilworth定理:对于一个偏序集,最少链划分等于最长反链长度。

代码:

#include<iostream> using namespace std; int main() { int num,len[5050]={0},max=0,len1[5050]={0},t=0; cin>>num; int h[5050]={0}; for(int i=0;i<num;i++) { cin>>h[i]; for(int j=i-1;j>=0;j--) { if(h[j]>=h[i]&&len[j]+1>len[i]) { len[i]=len[j]+1; if(max<len[i]) max=len[i]; } else if(h[j]<h[i]&&len1[j]+1>len1[i]) { len1[i]=len1[j]+1; if(len1[i]>t) t=len1[i]; } } } cout<<max+1<<' '<<t+1; cin.get(); cin.get(); return 0; }

点赞