首页 > 代码库 > 动态规划(4)———最长上升子序列(拦截导弹NYOJ79)
动态规划(4)———最长上升子序列(拦截导弹NYOJ79)
拦截导弹
- 描述
-
某国为了防御敌国的导弹袭击,发展中一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于等于前一发的高度。某天,雷达捕捉到敌国导弹来袭。由于该系统还在试用阶段,所以只用一套系统,因此有可能不能拦截所有的导弹。
- 输入
- 第一行输入测试数据组数N(1<=N<=10)
接下来一行输入这组测试数据共有多少个导弹m(1<=m<=20)
接下来行输入导弹依次飞来的高度,所有高度值均是大于0的正整数。 - 输出
- 输出最多能拦截的导弹数目
- 样例输入
2 8 389 207 155 300 299 170 158 65 3 88 34 65
- 样例输出
6 2
思路:
求给出序列的最长单调递减子序列的长度。
AC代码:1 //导弹拦截 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 using namespace std; 6 int num[22];//记录测试数据 7 int dp[22];//记录结果 8 int main() 9 { 10 int n; 11 scanf("%d",&n);//n组测试数据 12 while(n--) 13 { 14 int m; 15 scanf("%d",&m);//每组m个元素 16 memset(num,0,sizeof(num));//初始化 17 memset(dp,0,sizeof(dp)); 18 for(int i=1;i<=m;i++)//输入 19 { 20 scanf("%d",&num[i]); 21 } 22 23 for(int i=1;i<=m;i++)//自底向上进行填写以i为末尾的序列的单调递减子序列的最大长度 24 { 25 int ans=0; 26 for(int j=0;j<=i;j++) 27 { 28 if(num[i]<num[j]&&ans<dp[j]) 29 ans=dp[j]; 30 } 31 dp[i]=ans+1; 32 } 33 int ans=0;//求出最有值 34 for(int i=1;i<=m;i++) 35 { 36 if(ans<dp[i]) 37 ans=dp[i]; 38 } 39 printf("%d\n",ans); 40 } 41 42 return 0; 43 } 44
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。