信息学奥赛一本通(C++版)在线评测系统 (ssoier.cn)
这道题可以打表来做,a存储每个导弹的高度,b用来存储能拦截的导弹个数,刚开始初始化为1,默认可以拦截一个导弹。
如果后面的值比前面的值小,后面能拦截的导弹数就是前一个能拦截的导弹数的个数+1。
用一个maxx维护最大导弹数。
#include<iostream>
using namespace std;
const int N=30010;
int a[N],b[N];//存储数组,打表数组
int maxx=0;
int main()
{
int n=0;cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
b[i]=1;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i-1;j++)
{
if(a[i]<a[j]&&b[i]<b[j]+1)b[i]=b[j]+1;
if(b[i]>maxx)maxx=b[i];
}
}
cout<<maxx<<endl;
return 0;
}