您的位置:首页 > 其它

初识动态规划-最长不上升子序列

2017-08-15 15:10 225 查看
题目数据来自 [NOIP]拦截导弹

题目描述

某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截 系统有一个缺陷:虽然它的第一发炮弹能够达到任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试 用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。

输入

最多20个整数,分别表示导弹依次飞来的高度(雷达给出高度数据是不大于30000的正整数)

输出

第一行输出最多能拦截的导弹数

第二行输出要全部拦截最少需要的拦截系统数

样例输入

389 207 155 300 299 170 158 65

样例输出

6
2


第一次做到这一类的题目,完全不知道从何做起。参考网上代码并加上自己的理解之后写下代码存下来。相信读者朋友们在亲自用笔一步步计算之后会和我一样理解动态规划其中的巧妙之处!
备注:这不是AC代码!!!

#include <stdio.h>
int a[1010];
int la[1010];
int main()
{
int i,j,n,max,max1=1;
scanf("%d",&n);

for(i=1;i<=n;i++)
la[i]=1; //la数组存以第i个数为终点的最长不上升序列,数组la初始化为1,因为数最少都有一位,所以最长不上升子序列最少也为1
for(i=1;i<=n;i++)
scanf("%d",&a[i]);//a数组保存序列数组

for (i=2;i<=n;i++)
{
max=0;
for (j=1;j<=i-1;j++)
if(a[j]>a[i]&&la[j]>max)  //在前i-1个序列中,寻找以终点大于a[i]的最长的子序列,并更新max值
max=la[j];
la[i]=max+1;
if(la[i]>max1)           //对于这一段的理解,如果找到了比a[i]大的数,并且la[j](第i个数为终点的最长不上升序列)比max更大,则更新max的值,并将最后的max存入la[i]
max1=la[i];
}
printf("%d\n",max1);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: