题目:
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。
样例:
INPUT OUTPUT
389 207 155 300 299 170 158 65 6(最多能拦截的导弹数)
2(要拦截所有导弹最少要配备的系统数)
#include<iostream>
#include<sstream>
#include<algorithm>
using namespace std;
const int N(1000);
int h[N],f[N],g[N];
int main()
{
int n(0),x;
string s;
getline(cin,s);
istringstream is(s);
while (is>>x) h[++n]=x;
fill(f+1,f+n+1,1);
fill(g+1,g+n+1,1);
for (int i=1;i<=n;i++)
for (int j=1;j<i;j++)
{
if (h[j]>=h[i])
f[i]=max(f[j]+1,f[i]);
if (h[j]<h[i])
g[i]=max(g[j]+1,g[i]);
}
int ans1(1),ans2(1);
for (int i=1;i<=n;i++)
ans1=max(ans1,f[i]),ans2=max(ans2,g[i]);
cout<<ans1<<" "<<ans2<<endl;
system("pause");
return 0;
}
posted on 2013-05-12 16:42
龙在江湖 阅读(1148)
评论(2) 编辑 收藏 引用 所属分类:
动态规划 、
竞赛题解_NOIP