1020 导弹拦截
这个问题有两问,很明显是求一个最长下降子序列的长度问题,可以用很简单的DP来算,也可以用高效率,但这个题规模不太需要
设a[x]表示原序列第x个元素,b[x]表示长度为x的下降子序列的长度
处理到a[x]的时候,可以查找它连接到长度最大是多少的下降子序列,假设最大长度是maxx,那么b[x]=maxx+1,b数组被赋值的最大值就是第一问的答案
第二问,求的是长上升子序列,或者使用 贪心的方法,也就是每一个导弹来袭的时候,使用这颗导弹的防御系统中上一次拦截导弹高度最低的那一套来拦截,如果不存在,就用新的系统
#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
#define N 1001
using namespace std;
int a[N],b[N],c[N];
int main()
{
int n=0,maxx=1;
while(scanf("%d",&a[n++])!=EOF)
for(int i=0;i<n;i++)
{
b[i]=1;
for(int j=0;j<i;j++)
if(a[j]>=a[i]&&b[j]+1>b[i]) b[i]=b[j]+1;
maxx=max(maxx,b[i]);
}
printf("%d\n",maxx);
maxx=1;
for(int i=0;i<n;i++)
{
c[i]=1;
for(int j=0;j<i;j++)
if(a[j]<a[i]&&c[j]+1>c[i]) c[i]=c[j]+1;
maxx=max(maxx,c[i]);
}
printf("%d\n",maxx);
return 0;
}
214

被折叠的 条评论
为什么被折叠?



