最少拦截系统

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 11667    Accepted Submission(s): 4585

Problem Description
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天,雷达捕捉到敌国的导弹来袭.由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹.
怎么办呢?多搞几套系统呗!你说说倒蛮容易,成本呢?成本是个大问题啊.所以俺就到这里来求救了,请帮助计算一下最少需要多少套拦截系统.
 
Input
输入若干组数据.每组数据包括:导弹总个数(正整数),导弹依此飞来的高度(雷达给出的高度数据是不大于30000的正整数,用空格分隔)
 
Output
对应每组数据输出拦截所有导弹最少要配备多少套这种导弹拦截系统.
 
Sample Input
8 389 207 155 300 299 170 158 65
 
Sample Output
2013/5/16 15:12:00

  这道题实际上是重复求“最长非递增子序列”的过程。具体过程是重复倒序求最长非降(注意,实际上是非降)子序列,然后将每一次求出的最长非降序列剔除(将序列的每个值赋0),直到全部剔除(原序列全部变为0),剔除的次数就是至少要设置的拦截系统的数量。

  “倒序求最长非降子序列”即是求“最长非升子序列”(可以理解为“最长递减子序列”),可以想象,要求最长递减子序列,只要倒着求最长递增子序列就行了。为什么要这样求?因为动态规划里没有方法直接求最长递减子序列,只能通过最长递增子序列间接求最长递减子序列。  

  之前不太明白什么是“最长递增子序列”,从网上找了段解释看明白了:

  “所谓动态规划法就是从最后一个元素开始找递减子序列并记下该元素的位置和子序列的长度

  例如 对于题目中的  序列 9 8 2 1 7 5 3 4 3 2 1

  最后一个元素 是 1 ,它的位置是  11  ,最长递减子序列的长度是 1

  倒数第二个元素 是  2 ,它的位置是 10,最长递减子序列的长度是 2 (递减子序列为:2 1)

  倒数第三个元素是 3,位置是9,最长递减子序列长度是3 (递减子序列为 3 2 1)

  倒数第四个元素是4 ,位置是8 ,最长递减子序列长度是4 (递减子序列为4 3 2 1)

  倒数五个元素是3 ,位置7,最长递减子序列长度是3           (递减子序列为 3 2 1,这里注意不是 4 3 2 1,因为4 比倒数第五个元素3 大所以实际上是  后面的 2  1 这个子序列加上倒数第五个元素3 组成的 3 2 1)

  ...

  一直求解出每个元素的最长递减子序列的长度

  然后找出所有元素中最长的子序列长度.例如本例上最长的子序列长度就是第一个元素长度为8

  最后就是根据该 长度 还原出该 子序列。

  还原方法就是 递减循环 子序列的长度 找出对应的元素 位置.再根据位置获取到对应的值

  例如 子序列长度为8  对应的为第一个元素  即 9

  递减后为 7 对应的为第二个元素 即 8

  以此类推 最后还原出得到序列9 8 7 5 4 3 2 1  ”

 #include <iostream>
using namespace std; int main()
{
int n,a[];
while(cin>>n){
int i,index;
for(i=;i<=n;i++) //输入数组
cin>>a[i];
//找到最长非升子序列 int count=; while(true){
for(i=;i<=n;i++) //检测
if(a[i]!=) break; //全部为0,即将全部序列剔除之后退出循环
if(i>n) break; for(i=n;i>=;i--){
if(a[i]!=){
index=i; //标记倒序第一个不是0的数
break;
}
}
for(i=n-;i>=;i--){
if(a[i]==) continue;
if(i==index) continue;
if(a[i]>=a[index]) {a[index]=;index=i;} //比较当前数和标记的数。如果大于等于标记的上一个数,则将上次标记的数等于0,将本次标记。
}
a[index]=; //将最后标记的不是0的数赋值0
// for(i=1;i<=n;i++)
// cout<<a[i]<<' ';
// cout<<endl;
count++;
}
cout<<count<<endl; }
return ;
}

2014/1/20 16:21:27

  重新做了一遍,赫然发现贪心也可以AC。

  下面给出代码,仅供参考:

 #include <iostream>
using namespace std;
int main()
{
int n,a[];
while(cin>>n){
for(int i=;i<=n;i++)
cin>>a[i];
int b[]; //记录每个拦截系统的当前拦截高度
int count=;
for(int i=;i<=n;i++){
if(count==) //还没开始计数
b[++count] = a[i];
else{ //开始计数
int j;
for(j=;j<=count;j++) //将记录的所有系统的拦截高度和当前导弹高度依次比较
if(a[i]<=b[j]){ //遇到小于某个拦截高度,代替那个高度
b[j] = a[i];
break;
}
if(j>count){ //当前高度比记录的最小高度都要大,再建立一套拦截系统
count++;
b[count] = a[i];
}
}
}
cout<<count<<endl;
}
return ;
}

Freecode : www.cnblogs.com/yym2013

hdu 1257 最少拦截系统(动态规划 / 贪心)的更多相关文章

  1. HDU 1257 最少拦截系统(贪心 or LIS)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1257 最少拦截系统 Time Limit: 2000/1000 MS (Java/Others)   ...

  2. HDU 1257最少拦截系统[动态规划]

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1257                                                 最 ...

  3. hdu 1257 最少拦截系统【贪心 || DP——LIS】

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=1257 http://acm.hust.edu.cn/vjudge/contest/view.action ...

  4. HDU 1257 最少拦截系统 (DP || 贪心)

    最少拦截系统 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Statu ...

  5. POJ - 2533 Longest Ordered Subsequence与HDU - 1257 最少拦截系统 DP+贪心(最长上升子序列及最少序列个数)(LIS)

    Longest Ordered Subsequence A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let ...

  6. HDU——1257最少拦截系统(贪心)

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

  7. 题解报告:hdu 1257 最少拦截系统(贪心)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1257 Problem Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是 ...

  8. POJ 1065 Wooden Sticks / hdu 1257 最少拦截系统 DP 贪心

    参考链接:http://blog.csdn.net/xiaohuan1991/article/details/6956629 (HDU 1257 解题思路一样就不继续讲解) POJ 1065题意:给你 ...

  9. HDU 1257 最少拦截系统 【贪心】

    <题目链接> 题目大意: 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度 ...

  10. hdu 1257 最少拦截系统(简单贪心)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1257 虽然分类是dp感觉还是贪心 比较水 #include <iostream> #inclu ...

随机推荐

  1. java的重写、重载、覆盖的差别

    多态性  通过继承,一个类能够用作多种类型:能够用作它自己的类型.不论什么基类型,或者在实现接口时用作不论什么接口类型.这称为多态性  重载  每一个类型成员都有一个唯一的签名.方法签名由方法名称和一 ...

  2. 聊聊iClient for Leaflet坐标转换问题

    作者:非法小恋 背景 SuperMap iClient for JavaScript 9D产品想必大伙都用了一段时间了,针对新推出的三款客户端产品,Leaflet,OpenLayaers,Mapbox ...

  3. 你所不知道的 CSS 阴影技巧与细节 滚动视差?CSS 不在话下 神奇的选择器 :focus-within 当角色转换为面试官之后 NPOI 教程 - 3.2 打印相关设置 前端XSS相关整理 委托入门案例

    你所不知道的 CSS 阴影技巧与细节   关于 CSS 阴影,之前已经有写过一篇,box-shadow 与 filter:drop-shadow 详解及奇技淫巧,介绍了一些关于 box-shadow  ...

  4. EMQ ---客户端clientid为空,emq会随机帮忙生成

    mqtt v3.1.1协议有规定clientid可以为空,所以当客户端clientid为空,emq会随机帮忙生成. 如果clientid为空,随机生成clientid.例如'emqttd_105789 ...

  5. Apache重启报警,不存在虚拟主机目录(httpd.conf打开了一些扩展)

    Apache重启时报警: AH00112: Warning: DocumentRoot [/usr/local/apache/docs/dummy-host.example.com] does not ...

  6. connect: Network is unreachable解決方法

    connect: Network is unreachable解決方法   解決方式:請確認ifcfg-eth0檔案設定 指令如下:   vi /etc/sysconfig/network-scrip ...

  7. 简洁经常使用权限系统的设计与实现(一):构造权限菜单树的N(N&gt;=4)种方法

    权限系统.Web开发常见标准子系统之中的一个.结合自己的一些思考和实践,从本篇開始权限系统的设计与实现之路. 近期,重构了项目的权限菜单构造过程,向前端返回json格式的权限树. 这一篇.仅仅是大致介 ...

  8. Visual Studio:error MSB8020

    状况如下: error MSB8020: The builds tools for v120 (Platform Toolset = 'v120') cannot be found. To build ...

  9. Nginx、PCRE和中文URL(UTF8编码)rewrite路径重写匹配问题

    最近遇到了使用Nginx 重写中文UTF8编码路径的问题. 才发现默认情况下Nginx的rewrite是不支持UTF8匹配的. 比如: rewrite ^/(..)$ /2个字符文章.html bre ...

  10. 每日英语:The Upside of Favoritism

    As the head of the entertainment division of a major public-relations firm in New York, Janelle was ...