题目地址:http://oj.tsinsen.com/A1120

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

  输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。

输入格式
一行,为导弹依次飞来的高度
输出格式
两行,分别是最多能拦截的导弹数与要拦截所有导弹最少要配备的系统数
样例输入
389 207 155 300 299 170 158 65
样例输出
6
2

#include <stdio.h>int data[30000];
int dp[30000];int BSearch(int data[], int start, int end, int key){int middle;while (start <= end){//[start, end]middle = ((end - start) >> 1) + start;if (data[middle] < key)start = middle + 1;else if(data[middle] > key)end = middle - 1;elsereturn middle;}return start;
}void Insert(int data, int * nMax){int j = BSearch(dp, 0, *nMax, data);if (j > *nMax){*nMax = j;dp[j] = data;}else if(dp[j-1] < data && data < dp[j]){dp[j] = data;}
}int LDS(int n){int i;int nMaxLDS = 1;dp[0] = -1;dp[1] = data[n-1];for (i = n - 2; i >= 0; --i){Insert(data[i], &nMaxLDS);}return nMaxLDS;
}int LIS(int n){int i;int nMaxLIS = 1;dp[0] = -1;dp[1] = data[0];for (i = 1; i < n; ++i){Insert(data[i], &nMaxLIS);}return nMaxLIS;
}int main(void){int i = 0;char tmp;while (scanf("%d%c", &data[i++], &tmp) != EOF && tmp != '\n')continue;printf("%d\n", LDS(i));printf("%d\n", LIS(i));return 0;
}

算法详解见http://blog.csdn.net/jdplus/article/details/19482027

九度OJ上相似的题目:http://ac.jobdu.com/problem.php?pid=1112

HDOJ上相似的题目:http://acm.hdu.edu.cn/showproblem.php?pid=1257

转载于:https://www.cnblogs.com/liushaobo/p/4373748.html

清橙 A1120 拦截导弹 -- 动态规划(最长上升子序列)相关推荐

  1. 动态规划—最长公共子序列问题 HDU-1159 Common Subsequence

    动态规划-最长公共子序列问题 Common Subsequence [ HDU - 1159 ] A subsequence of a given sequence is the given sequ ...

  2. 详解动态规划最长公共子序列--JavaScript实现

    前面两篇我们讲解了01背包问题和最少硬币找零问题.这篇将介绍另一个经典的动态规划问题--最长公共子序列.如果没看过前两篇,可点击下面链接. 详解动态规划最少硬币找零问题--JavaScript实现 详 ...

  3. 动态规划1--最长公共子序列

    动态规划1--最长公共子序列 一.动态规划 经常会遇到复杂问题不能简单地分解成几个子问题,而会分解出一系列的子问题.简单地采用把大问题分解成子问题,并 综合子问题的解导出大问题的解的方法,问题求解耗时 ...

  4. 动态规划——最长上升子序列问题(LIS)

    动态规划--最长上升子序列问题(LIS) 最长上升子序列问题(LIS).给定n个整数A1,A2,-,AnA_1, A_2, \dots , A_n,按从左到右的顺序选出尽量多的整数,组成一个上升子序列 ...

  5. 最长公共子序列php,动态规划(最长公共子序列LCS)

    概念 求解决策过程最优化的结果 (可能有多个) 把多阶段过程转化为一系列单阶段过程,利用各阶段之间的关系,逐个求解 计算过程中会把结果都记录下,最终结果在记录中找到. 举例 求两个字符串的最长公共子序 ...

  6. 最长公共子序列动态规划c语言,动态规划----最长公共子序列(C++实现)

    最长公共子序列 题目描述:给定两个字符串s1 s2 - sn和t1 t2 - tm .求出这两个字符串的最长公共子序列的长度.字符串s1 s2 - sn的子序列指可以表示为 - { i1 < i ...

  7. HDOJ---1257 最少拦截系统[线性DP]+NYOJ---拦截导弹[输出最长单调子序列的长度]

    最少拦截系统 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  8. 动态规划—最长上升子序列(POJ 1458)

    摘要 本文主要介绍了 经典算法题 最长上升子序列的动态规划解法,同时用北大OJ的案例来补充说明,意在学习动态规划的基本思想和解题过程,供大家一起学习! 什么是最长上升子序列? 最长上升子序列(Long ...

  9. HDU 1257 最少拦截系统【最长上升子序列】

    解题思路:可以转化为求最长上升子序列来做,还是可以用an与按升序排列后的an求LCS来做,为防止超时,用滚动数组优化一下就可以了. 最少拦截系统 Time Limit: 2000/1000 MS (J ...

最新文章

  1. 一和零(二维01背包)
  2. ipv4校验(java)
  3. 分布式版本控制系统Git学习资源收集汇总
  4. HDU4307(最小割)
  5. 如何在 SAP BTP 平台 ABAP 编程环境里消费基于 SOAP 的 Web Service
  6. ubuntu 14.04 LTS(64bit) Anacoda2环境下安装gensim
  7. C++ double转CStringW/LPCWSTR
  8. Bzoj 4147: [AMPPZ2014]Euclidean Nim(博弈)
  9. Java类加载器 以及类加载器的委托模型
  10. EF中关于TransactionScope的使用
  11. 6.gloox 之 MessageHandler
  12. C# 调用系统API 内核 简单样例
  13. echarts legend属性_Vue 项目如何使用Echarts , 手摸手带你入门
  14. Unity3D资源加载Resources
  15. 2022年云南最新消防设施操作员模拟试题题库及答案
  16. 上课作业(5)——#576. 饥饿的牛(hunger)
  17. 汇编笔记-在屏幕中间分别显示绿色,绿底红色,白底蓝色的字符串“welcome to masm!”
  18. 《Linux内核修炼之道》精华分享与讨论(1)——缅怀已逝的十八年(1991~1998)
  19. Idea使用起来反应比较慢
  20. 批量打印--不展现直接后台打印

热门文章

  1. 【Linux】一步一步学Linux——ethtool命令(155)
  2. 【Linux】一步一步学Linux——egrep命令(50)
  3. 【Linux】一步一步学Linux——Linux系统常用快捷键(12) 待更新...
  4. 【Libevent】Libevent学习笔记(二):创建event_base
  5. 北师大本科毕业需要过计算机二级吗,全国计算机二级
  6. oracle_j000,Process J000 died, kkjcre1p: unable to spawn jobq slave process引起的宕机
  7. currentdate mysql_Mysql】Mysql中CURRENT_TIMESTAMP,CURRENT_DATE,CURRENT_TIME,now(),sysdate()各项值的区别...
  8. linux关于/etc/profile.d与/etc/profile的正确运用
  9. All is about C!
  10. vscode 上刷leetcode算法题(含配置)