题目描述:
某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭,并观测到导弹依次飞来的高度,请计算这套系统最多能拦截多少导弹。拦截来袭导弹时,必须按来袭导弹袭击的时间顺序,不允许先拦截后面的导弹,再拦截前面的导弹。 
 
输入:
每组输入有两行,
第一行,输入雷达捕捉到的敌国导弹的数量k(k<=25),

第二行,输入k个正整数,表示k枚导弹的高度,按来袭导弹的袭击时间顺序给出,以空格分隔。

输出:
每组输出只有一行,包含一个整数,表示最多能拦截多少枚导弹。
 
样例输入:
8
300 207 155 300 299 170 158 65
样例输出:
6
 #include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#define MAX 30
using namespace std; int num[MAX];
int count[MAX]; int main(int argc, char const *argv[])
{
int n;
//freopen("input.txt","r",stdin); while(scanf("%d",&n) != EOF) {
if(n <= ) {
printf("0\n");
continue;
}
for(int i = ; i < n; i++) {
scanf("%d",&num[i]);
count[i] = ;
}
count[n - ] = ;
int max = ;
for(int j = n - ; j >= ; j--) {
int maxMin = -;
for(int k = j + ; k < n; k++) {
if(num[k] <= num[j] && maxMin == -) {
maxMin = k;
}
else if(num[k] <= num[j] && count[k] > count[maxMin]) {
maxMin = k;
}
}
if(maxMin != -) {
count[j] = count[maxMin] + ;
}
if(max < count[j]) {
max = count[j];
}
}
printf("%d\n",max);
/*for(int i = 0; i < n; i++) {
printf("%d ",count[i]);
}
printf("\n");*/
} return ;
}

做这道题是脑子犯了糊涂,在33行应比较count而不是比较num,导致错误了3次,此处count[k]取大于或大于等于count[maxMin]均可。

另外需注意n == 0时的情况

----------2016-9-17更新

现在再看这到题,它要我们求的其实是一个不严格下降子序列(即非上升子序列)的最长长度。

----------2016-11-23更新

今天在nyoj上发现一道一模一样的题(题目79),题目如下

拦截导弹

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
 
描述

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

 
输入
第一行输入测试数据组数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 <cstdio>
#include <cstring> int s[];
int dp[]; int main(int argc, char const *argv[])
{
int n;
scanf("%d",&n);
while(n--) {
int m;
scanf("%d",&m);
for(int i = ; i < m; i++) {
scanf("%d",&s[i]);
}
memset(dp, , sizeof(dp)); dp[] = ;
int ans = ;
for(int i = ; i < m; i++) {
int maxv = ;
for(int j = i-; j >= ; j--) {
if(s[j] > s[i] && maxv < dp[j]) {
maxv = dp[j];
}
}
dp[i] = maxv+;
if(ans < dp[i]) {
ans = dp[i];
}
}
printf("%d\n", ans);
}
return ;
}

最新文章

  1. [No000092]SVN学习笔记3-Import/Checkout(迁入/迁出),GetLock(加锁)
  2. rc.local 增加自启动
  3. gulp 使用介绍
  4. 图解Android Studio导入Eclipse项目源码
  5. 【VB超简单入门】二、知识准备
  6. Process启动.exe,当.exe内部抛出异常时,总会弹出一个错误提示框,阻止Process进入结束
  7. C++11 std::bind std::function 高级使用方法
  8. Web Service中的XFire 传输List 自定义对象.
  9. 怎样从一个DLL中导出一个C++类
  10. 读书笔记—CLR via C#章节4-7
  11. (转)每天一个linux命令(50):crontab命令
  12. Django学习之django自带的contentType表 GenericRelation GenericForeignKey
  13. 打包JAR,MANIFEST.MF格式
  14. 编写blog第一天
  15. MongoDB修改默认数据库
  16. python之语音识别(speech模块)
  17. Java数据结构和算法(十):二叉树
  18. Python学习之路:一天搞定基础部分
  19. C#线程篇---Windows调度线程准则(3)
  20. COCO 数据集使用说明书

热门文章

  1. hdu6376 度度熊剪纸条
  2. ES-windos环搭建-ik中文分词器
  3. datagrid数据网格获取所有选中行的索引,插入某个列值为其他列的运算值
  4. ycsb模板介绍
  5. hdu 3555 Bomb 炸弹(数位DP,入门)
  6. 换个语言学一下 Golang (1)
  7. springboot上传linux文件无法浏览,提示404错误
  8. JdbcTemplate类对sql的操作使用
  9. HTML5触摸事件
  10. 【网络流】[USACO4.2]草地排水Drainage Ditches