导弹拦截 最长递减(增)子序列问题
2015-03-29 22:02
204 查看
某国为了防御敌国的导弹袭击,发展中一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,
但是以后每一发炮弹都不能高于等于前一发的高度。
某天,雷达捕捉到敌国导弹来袭。由于该系统还在试用阶段,所以只用一套系统,因此有可能不能拦截所有的导弹。
输入第一行输入测试数据组数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
回溯法:
但是以后每一发炮弹都不能高于等于前一发的高度。
某天,雷达捕捉到敌国导弹来袭。由于该系统还在试用阶段,所以只用一套系统,因此有可能不能拦截所有的导弹。
输入第一行输入测试数据组数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
回溯法:
#include<stdio.h> #define N 20 int main() { int t,n,i; int array ,record ;//array用来装输入的数值,record用来记录要求的最长递增子序列 int flag,temp; scanf("%d",&t); while(t--) { flag=1; scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",&array[i]); record[1]=array[1]; for(i=2;i<=n;i++) { if(record[flag]>array[i])//如果当前的数大于下一个数, { flag++; record[flag]=array[i];//record下标加1后,存放下一个值 } else //否则,大于或者等于下一个数时,采用回溯法,找到前面已经存入record中的大于下一个数的下标,将下一个数存入该下标的后一位 { temp=flag-1; while(temp>0 && record[temp]<=array[i]) temp--; record[temp+1]=array[i];//record中保存的就是最终的最长递减子序列 } } printf("%d\n",flag); } return 0; } 同理可求得最长递增子序列 #include <stdio.h> #define N 20 int main () { int i,t,n,flag,temp;//t为测试组数,n为每组测试个数,flag为输出结果 int record ,array ;//array为原数组,record为最长递增数组 scanf("%d",&t); while(t--) { flag = 1; scanf("%d",&n); for(i = 1; i <= n; i++) scanf("%d",&array[i]); record[1] = array[1]; for(i = 2; i <= n; i++) { if(record[flag] < array[i]) { flag++; record[flag] = array[i]; } else { temp = flag-1; while(temp > 0 && record[temp] > array[i]) temp--; record[temp+1] = array[i]; } } printf("%d",flag); } return 0;
相关文章推荐
- 最长递增、递减子序列(导弹拦截问题)动态规划练习
- 【最长上升子序列】[NOIP1999]拦截导弹
- CDOJ 251 导弹拦截 (LIS,一种找到字典序最小的最长上升子序列的方法)
- 导弹拦截(最长下(升)降子序列 dp)
- nyoj 79 拦截导弹 连续递减最长子序列(动态规划)
- 拦截导弹 转化为求最大递减问题
- NIOP 1999 导弹问题 最长升降序子序列 DP[小思路]
- 题目1112:拦截导弹(最长非递增子序列)
- 最长升序和降序子序列-导弹拦截2
- 蓝桥杯算法训练拦截导弹【最长上升子序列 & 最长非下降子序列nlogn 和 n^2】
- HDU 1257 最少拦截系统 (贪心---求最长递减序列(不连续的))
- nyoj 79 拦截导弹 【最长递增子序列】
- NYOJ - 79 - 拦截导弹(动态规划--LIS--最长递增子序列变形)
- 最长递减子序列问题
- HDOJ---1257 最少拦截系统[线性DP]+NYOJ---拦截导弹[输出最长单调子序列的长度]
- 九度题目:导弹拦截(1112)最大不增子序列 dp问题
- [dp][uestc oj][最长上升子序列] LIS N - 导弹拦截
- 【动态规划】【二分】【最长不下降子序列】洛谷 P1020 导弹拦截
- 拦截导弹(规律:下降子序列的个数等于最长上升子序列的长度)
- CODE(VS) 1044 导弹拦截 (判断最长递增和最长递减子序列)