导弹拦截系统
某导弹拦截系统在试用阶段发现一个缺陷:虽然它的第一发炮弹能到达任意高度,但是之后每一发炮弹都不能超过前一发的高度。因此有可能不能拦截所有导弹。现在已知n枚导弹依次飞来的高度h(正整数h<=30000),问:
1、这套系统最多能拦截多少枚导弹?
2、若要拦截所有导弹,最少需要配备多少套系统?
输入:n (1<=n<=1000)
n颗导弹飞来的高度
输出:一套系统的最多拦截数
依次列出被拦截导弹序号(若多解,输出最后一个拦截序列)
全部拦截所需配备的系统数
【样例】
输入: 9
30 10 20 15 6 5 9 8 7
输出: 6
1 3 4 7 8 9
2
/*分析:其实是求最长不上升数列和最长上升序列的长度*/
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
int a[1000001];
int f[1000001];
int p[1000001];
int main(){
freopen("missile.in","r",stdin);
freopen("missile.out","w",stdout);
int i,j,k,m,n,s,ans=0,sum=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(i=n;i>=1;i--){
f[i]=1;p[i]=i;
for(j=i+1;j<=n;j++)
if(a[i]>=a[j] && f[i]<f[j]+1){
f[i]=f[j]+1;
p[i]=j;
}
if(f[i]>ans){
ans=f[i];s=i;
}
}
printf("%d\n",ans);
printf("%d",s);
while(s!=p[s]){
s=p[s];printf(" %d",s);
}printf("\n");ans=0;
for(i=n;i>=1;i--){
f[i]=1;p[i]=i;
for(j=i+1;j<=n;j++)
if(a[i]<a[j] && f[i]<f[j]+1){
f[i]=f[j]+1;
p[i]=j;
}
if(f[i]>ans){
ans=f[i];s=i;
}
}
printf("%d\n",ans);
return 0;
}