题目描述
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭,由于该系统还在试用阶段。所以只有一套系统,因此有可能不能拦截所有的导弹。
输入导弹依次飞来的高度(雷达给出的高度不大于30000的正整数)。计算这套系统最多能拦截多少导弹。
输入
N颗依次飞来的导弹高度,(导弹个数<=1000)。
输出
一套系统最多拦截的导弹数,并依次打印输出被拦截导弹的高度。
注意:若有多种拦截导弹的方案,则应输出导弹编号尽量靠前的那种方案。
样例输入
300 250 275 252 200 138 245
样例输出
5 300 275 252 200 138
这道题就是求最长下降子序列。
代码:
#include <bits/stdc++.h>
using namespace std;
int a[10001][4];
int main()
{
int n=1;
while(cin>>a[n][1])
{
a[n][2]=1;
a[n][3]=0;
n++;
}
n--;
for(int i=n-1;i>=1;i--)
{
int max1=0,max2=1;
for(int j=i+1;j<=n;j++)
{
if(a[j][1]<=a[i][1]&&a[j][2]>max1)
{
max1=a[j][2];
max2=j;
}
}
if(max1>0)
{
a[i][2]=max1+1;
a[i][3]=max2;
}
}
int k=1;
for(int i=2;i<=n;i++)
{
if(a[i][2]>a[k][2]) k=i;
}
cout<<a[k][2]<<endl;
while(k!=0)
{
cout<<a[k][1]<<' ';
k=a[k][3];
}
return 0;
}