NIOP 1999 导弹问题 最长升降序子序列 DP[小思路]
来源:互联网 发布:网上寺院软件下载 编辑:程序博客网 时间:2024/05/17 06:30
题目描述
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
输入格式
输入数据为两行,
第一行为导弹的数目N(n<=1000)
第二行导弹依次飞来的高度,所有高度值均为不大于30000的正整数。
输出格式
输出只有一行是这套系统最多能拦截的导弹数和要拦截所有导弹最少要配备这种导弹拦截系统的套数。两个数据之间用一个空格隔开.
样例输入
8389 207 155 300 299 170 158 65样例输出
6 2三维状态图像
#include<iostream>using namespace std;int max( int a,int b ){ return a>b?a:b; }int main(){ int n; int date[1000]; int DP1[1000]; int count[1000]; for( int i=0;i<1000;i++ ) date[i]=DP1[i]=count[i]=0; scanf( "%d",&n ); for( int i=0;i<n;i++ ) scanf( "%d",&date[i] ); int ans1=0; for( int i=0;i<n;i++ ) { for( int j=0;j<i;j++ ) if( date[i]<date[j] ) DP1[i]=max(DP1[i],DP1[j]); DP1[i]++; ans1=max( ans1,DP1[i] ); //count[DP[i]]++; } int ans2=0; for( int i=0;i<n;i++ ) { DP1[i]=0; for( int j=0;j<i;j++ ) if( date[i]>date[j] ) DP1[i]=max(DP1[i],DP1[j]); DP1[i]++; ans2=max( ans2,DP1[i] ); //count[DP[i]]++; } printf( "%d %d\n",ans1,ans2 ); return 0;}
第一问很简单。直接最长降序子序列。
那么第二问怎么办?开始想了很久没有想通。我简单的认为只是在第一问求出的基础上求出相应DP值的个数最多的那个就是答案了。这么想看上去有道理。因为最高的这么打下来,会消灭很多比他低的,有多少个1就可以发多少枚炮弹,如果剩余了2的话,就以2为起始点放炮。这样看上去很正确,但是实际上却是错的。为什么?因为DP的标号不代表高度。例如DP[I]=2,DP[J]=1;可以说明high[I]>high[J]吗?不行。既然这样不成立,那我的那种按DP标号来进行判断的方式当然不成立了。
举一个很小的例子,2 5 3 4 这样我算出来会是2,实际上却要3枚才能打完。
正确的思路呢?每颗炮弹都要被击中,比当前点高的又在后面的炮弹就打不中了。这样就转化为就最长升序子序列了。
- NIOP 1999 导弹问题 最长升降序子序列 DP[小思路]
- codevs1044 拦截导弹(最长不下降子序列dp)
- 导弹拦截(最长下降子序列 dp)
- 蓝桥杯 拦截导弹(dp 最长下降子序列)
- Vijos P1303 导弹拦截【最长上升子序列+DP】
- NYOJ201-作业题(最长升降子序列)
- 导弹拦截 最长递减(增)子序列问题
- Is Bigger Smarter?+uva+简单dp(最长公共升降子序列的变形)
- NOIP 1999 导弹拦截 (最长不下降子序列)
- hdu 1160 DP 最长子序列问题
- 最长公共子序列问题 经典DP
- [dp]最长公共子序列问题
- DP---LCS 最长公共子序列问题
- 用DP解决最长子序列问题
- 拦截导弹----RQNOJ_217----最长单调子序列
- 【最长上升子序列】[NOIP1999]拦截导弹
- hdu1257 拦截导弹 最长上升子序列
- 【最长递增子序列】 导弹拦截系统
- 编写并安装int 7ch中断例程,功能为显示一个用0结束的字符串,中断例程安装在0:200处
- 禁止页面使用backspace返回到上一级目录
- matlab创建动态链接库时遇到的两个问题
- rh5安oracle总结——上下键不能用、ed命令、无法本地启动ODBC
- vim tips
- NIOP 1999 导弹问题 最长升降序子序列 DP[小思路]
- word去掉页面横线
- 数据结构之顺序栈的操作(C语言)
- copy_to_user和copy_from_user两个函数的分析(转)
- inerted,deleted
- windows phone 中ListBox采用多模板
- c++之串流类
- RTP协议解析
- 奇思妙想:15位计算机天才及其重大发现