初识动态规划-最长不上升子序列
2017-08-15 15:10
225 查看
题目数据来自 [NOIP]拦截导弹
第二行输出要全部拦截最少需要的拦截系统数
第一次做到这一类的题目,完全不知道从何做起。参考网上代码并加上自己的理解之后写下代码存下来。相信读者朋友们在亲自用笔一步步计算之后会和我一样理解动态规划其中的巧妙之处!
备注:这不是AC代码!!!
题目描述
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截 系统有一个缺陷:虽然它的第一发炮弹能够达到任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试 用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。输入
最多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; }
相关文章推荐
- 动态规划——最长公共上升子序列LCIS
- 动态规划专练4 最长上升子序列
- 动态规划:最长上升子序列
- 动态规划 最长公共子序列 最长上升子序列 最长上升公共子序列
- 动态规划-最长上升子序列(LIS)
- codves动态规划 最长上升子序列
- caioj1064:动态规划入门(一维一边推2:最长上升子序列)
- 动态规划-最长上升子序列(LIS)
- uva 11400 - Lighting System Design(动态规划 最长上升子序列问题变型)
- YTU OJ 3135: 动态规划基础题目之最长上升子序列(Java解题)
- 动态规划之最长上升子序列(未完待续)
- 动态规划-最长上升子序列(LIS)
- 动态规划入门 COGS1398 最长上升子序列
- J - FatMouse's Speed HDU 1160 (动态规划,最长上升子序列+路径输出)
- 动态规划-最长上升子序列(LIS)
- 动态规划——E (LIS())最长上升子序列
- 动态规划 最长上升子序列
- 动态规划:最长上升子序列
- 动态规划之最长上升子序列
- 动态规划-最长上升子序列(LIS)