一种导弹拦截系统,虽然它的第一发炮弹能够到达任意高度,但是以后每一发炮弹都不能高于前一发的高度。计算最多拦截导弹数及需要导弹拦截系统数。
输入:
389 207 155 300 299 170 158 65
输出:
6
2
#include<bits/stdc++.h>
using namespace std;
int h[101],a[101],b[101];
int main()
{
int x,i,j,sum1,sum2;
while(cin>>x)
h[i++]=x;//储存高度h
int l=i;
for(i=0;i<l;i++)
{
a[i]=1,b[i]=1;//a[i]表示前i导弹能拦截数b[i]表示需要系统数
for(j=0;j<i;j++)
{
if(h[j]>h[i])
a[i]=max(a[i],a[j]+1);
else
b[i]=max(b[i],b[j]+1);
}
sum1=max(sum1,a[i]);
sum2=max(sum2,b[i]);
}
cout<<sum1<<endl<<sum2;
return 0;
}
a[i]表示前i导弹能拦截数
b[i]表示需要系统数
状态变迁:
if(h[j]>h[i])
a[i]=max(a[i],a[j]+1); //最长下降子序列
b[i]=max(b[i],b[j]+1);//最长上升子序列