拦截导弹
Description
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
Input
每个测试文件只包含一组测试数据,每组输入若干个整数,表示导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数)。
Output
对于每组输入数据,第一行输出这套系统最多能拦截多少导弹,第二行输出如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。
Sample Input 1
389 207 155 300 299 170 158 65
Sample Output 1
6
2
经典的动态规划,第一问类似于最长不下降子序列。我们可以将这道题分析成图。
但有一点尤其注意,比如像下图
而第二题只要用一个ans来存,导弹没拦完就再加一各系统。
#include <bits/stdc++.h>
int a[10010];
int num[10010];
int dp[10010];
int n=0;
int x;
int ans=0,maxn=0;
using namespace std;
int main(){
while(cin>>x)
num[++n]=x;
for(int i=1;i<=n;i++)
a[i]=dp[i]=1;
for(int i=1;i<=n;i++){
for(int j=1;j<i;j++){
if(num[i]<=num[j])
a[i]=max(a[i],a[j]+1);
if(num[i]>num[j])
dp[i]=max(dp[i],dp[j]+1);
}
}
for(int i=1;i<=n;i++){
ans=max(ans,a[i]);
maxn=max(maxn,dp[i]);
}
cout<<ans<<endl;
cout<<maxn;
return 0;
}