nyoj 814 又见拦截导弹 【LIS 原始求法】
2015-01-21 22:22
162 查看
又见拦截导弹
时间限制:3000 ms | 内存限制:65535 KB难度:3
描述
大家对拦截导弹那个题目应该比较熟悉了,我再叙述一下题意:某国为了防御敌国的导弹袭击,新研制出来一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度。突然有一天,雷达捕捉到敌国的导弹来袭。由于该系统存在缺陷,所以如果想把所有的导弹都拦截下来,就要多准备几套这样的导弹拦截系统。但是由于该系统成本太高,所以为了降低成本,请你计算一下最少需要多少套拦截系统。
输入有多组测试数据。
每组数据先输入一个整数N(N≤3000),代表有N发导弹来袭。接下来有N个数,分别代表依次飞来的导弹的导弹的高度。当N=-1时表示输入结束。输出每组输出数据占一行,表示最少需要多少套拦截系统。样例输入
8 389 207 155 300 299 170 158 65 5 265 156 123 76 26
样例输出
2 1
dp代码:(后面贪心代码)
#include<stdio.h> int dp[3010]; int main() { int n,i,j; int max; int h[3010]; while(scanf("%d",&n)&&(n!=-1)) { for(i=0;i<n;i++) { scanf("%d",&h[i]); dp[i]=1; } for(i=1;i<n;i++) { for(j=0;j<i;j++) { if(h[i]>h[j]&&dp[i]<dp[j]+1) { dp[i]=dp[j]+1; } } } max=0; for(i=0;i<n;i++) { if(dp[i]>max) max=dp[i]; } printf("%d\n",max); } return 0; }
[/code]
贪心代码:
#include<stdio.h> #include<string.h> int dp[3010]; int main() { int n,i,j; int exist; int xulie; int h[3010]; while(scanf("%d",&n)&&(n!=-1)) { for(i=0;i<n;i++) { scanf("%d",&h[i]); } memset(dp,0,sizeof(dp)); xulie=1;dp[0]=h[0]; for(i=0;i<n;i++) { exist=1; for(j=0;j<xulie;j++)//用dp记录单调子序列的第一个数 { if(dp[j]>=h[i]) //只要小于或等于前面其中一个子序列的第一个数,就更新该子序列的第一位数并进行下一个高度判断。 { exist=0; dp[j]=h[i]; break; } } if(exist)//遍历所有子序列,都找不到可以插入的序列,重开一个序列 dp[xulie++]=h[i]; } printf("%d\n",xulie); } return 0; }
[/code]
相关文章推荐
- nyoj 又见拦截导弹 814 (DP+LIS)
- NYOJ-814-又见拦截导弹【最少LIS段数问题】
- nyoj 814 又见拦截导弹
- NYOJ 814 又见导弹拦截
- nyoj 814又见拦截导弹
- nyoj 814 又见拦截导弹
- NYOJ 79 拦截导弹 (经典dp) 最长上升子序列 LIS
- NYOJ 814 又见拦截导弹
- nyoj 814 又见导弹拦截
- 又见导弹拦截 nyoj 814
- nyoj814_又见拦截导弹_DP
- NYOJ 814 又见拦截导弹
- nyoj814又见拦截导弹
- NYOJ 814 又见拦截导弹
- nyoj 拦截导弹 79 (转换为LIS)
- NYOJ 814 又见拦截导弹
- nyoj814 又见拦截导弹 贪心
- NYOJ 814 又见拦截导弹
- nyoj 814 又见拦截导弹
- NYOJ - 79 - 拦截导弹(动态规划--LIS--最长递增子序列变形)