hdu 1257 最少拦截系统(动态规划 / 贪心)
最少拦截系统
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 11667 Accepted Submission(s): 4585
怎么办呢?多搞几套系统呗!你说说倒蛮容易,成本呢?成本是个大问题啊.所以俺就到这里来求救了,请帮助计算一下最少需要多少套拦截系统.
这道题实际上是重复求“最长非递增子序列”的过程。具体过程是重复倒序求最长非降(注意,实际上是非降)子序列,然后将每一次求出的最长非降序列剔除(将序列的每个值赋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 最少拦截系统(动态规划 / 贪心)的更多相关文章
- HDU 1257 最少拦截系统(贪心 or LIS)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1257 最少拦截系统 Time Limit: 2000/1000 MS (Java/Others) ...
- HDU 1257最少拦截系统[动态规划]
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1257 最 ...
- hdu 1257 最少拦截系统【贪心 || DP——LIS】
链接: http://acm.hdu.edu.cn/showproblem.php?pid=1257 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- HDU 1257 最少拦截系统 (DP || 贪心)
最少拦截系统 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Statu ...
- POJ - 2533 Longest Ordered Subsequence与HDU - 1257 最少拦截系统 DP+贪心(最长上升子序列及最少序列个数)(LIS)
Longest Ordered Subsequence A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let ...
- HDU——1257最少拦截系统(贪心)
最少拦截系统 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- 题解报告:hdu 1257 最少拦截系统(贪心)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1257 Problem Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是 ...
- POJ 1065 Wooden Sticks / hdu 1257 最少拦截系统 DP 贪心
参考链接:http://blog.csdn.net/xiaohuan1991/article/details/6956629 (HDU 1257 解题思路一样就不继续讲解) POJ 1065题意:给你 ...
- HDU 1257 最少拦截系统 【贪心】
<题目链接> 题目大意: 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度 ...
- hdu 1257 最少拦截系统(简单贪心)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1257 虽然分类是dp感觉还是贪心 比较水 #include <iostream> #inclu ...
随机推荐
- 20-spring学习-Spring MVC基本操作
本次实现数据的CRUD功能,数据依然以VO类形式进行数据接收. 一,建立Message.java类操作,负责数据的接收操作. package com.SpringMVC.vo; public clas ...
- panel,dialog,window组件越界(超出范围)问题汇总
参考地址 之前分别写过panel,dialog,window三个组件因为拖曳或者reSize造成组件越界而无法还原的问题,两篇文章分别针对拖曳和reSize给出了解决方案.不过根据朋友的反馈,reSi ...
- Android 应用开发实例之情景模式
2013-07-01 Android 应用开发实例 1. 情景模式 使用TabHost来实现主界面的布局. 设置一组RadioButton来切换不同的情景模式. 对比普通情景模式,定时情景模式需要加上 ...
- Linux-ssh证书登录(实例详解)
前言 本文基于实际Linux管理工作,实例讲解工作中使用ssh证书登录的实际流程,讲解ssh证书登录的配置原理,基于配置原理,解决实际工作中,windows下使用SecureCRT证书登录的各种问题, ...
- LaTeX 中文段首空格问题
一般用 “\\”或者回车可以使得下一段段首空两格,但是对于第一段就不行了. 解决办法: 加一个\usepackage{indentfirst}就可以
- Python 字符串与数字拼接报错
Python 不像 JS 或者 PHP 这种弱类型语言里在字符串连接时会自动转换类型,而是直接报错. 如: 上述是Python 字符串与数字拼接报错,解决办法是:使用bytes函数把int型转换为st ...
- spring Log4j关于No appenders could be found for logger的警告
(spring环境下)配置Log4j时候,当启动WEB程序时,提示了如标题的警告,具体如下:log4j:WARN No appenders could be found for logger (org ...
- PHP位运算符(转)
例子 名称 结果 $a & $b And(按位与) 将在 $a 和 $b 中都为 1 的位设为 1. $a | $b Or(按位或) 将在 $a 或者 $b 中为 1 的位设为 1. $a ^ ...
- Android Launcher拖拽事件详解【android4.0--Launcher系列二】
AndroidICS4.0版本的launcher拖 拽的流程,基本和2.3的相似.就是比2.3写的封装的接口多了一些,比如删除类的写法就多了个类.等等.4.0的改变有一些,但是不是特别大.这个月一 直 ...
- 关于windows10 CMD 的一些操作
之前接触过cmd的一些操作方法,比如用dir.tasklist等一些方法,但是用了会立马忘记,再用到时又要重新google,这着实让我头痛!!! 今天又碰到一个关于改变目录的问题,又是纠结万分,所以就 ...