动态规划,导弹拦截系统

qepjatdwj 2009-04-08 11:27:44
/* Note:Your choice is C IDE */
#include "stdio.h"
#include<iostream>
using namespace std;
int main()
{
int i,j,x[100],d[100]; //x[]表示各个导弹高度,d[i]记录为第 i 枚导弹被拦截之后,
//这套系统最多还能拦截的导弹数(包含被拦截的第 i 枚)。
int dmax=0,xh=0; //记录拦截的最大个数以及第一个被拦截的序号
int n=8; //拦截的导弹数
cout<<"输入产生导弹的序列:"<<endl;
for(i=0;i<8;i++)
{
cin>>x[i]; //输入每个导弹的高度
d[i]=1; //初始值都设为1
}
for(i=n-2;i>=0;i--) //动态规划算法,递归实现,从后面向前循环
{
for(j=i+1;j<n;j++)
if((x[j]<x[i])&&(d[i]<d[j]+1)) //判断条件
{
d[i]=d[j]+1; //这个地方不太明白,想了很久
}
}
for(i=0;i<n;i++) //找出最大个数
{
if(d[i]>dmax)
{
dmax=d[i];
xh=i; //第一枚被拦截的导弹序号
}
}
cout<<"拦截到的导弹数为:";
cout<<d[xh]<<endl;
cout<<"被拦截的导弹序列为:";
cout<<x[xh]<<",";
for(j=xh+1;j<n;j++) //依次输出满足条件的递减序号
if((x[j]<=x[xh])&&(d[xh]==d[j]+1)) //判断条件
{
cout<<x[j]<<",";
xh=j;
}
return 0;
}

for(i=n-2;i>=0;i--) //动态规划算法,递归实现,从后面向前循环
{
for(j=i+1;j<n;j++)
if((x[j]<x[i])&&(d[i]<d[j]+1)) //判断条件
{
d[i]=d[j]+1; //这个地方不太明白,想了很久
}
} 就是这部分不太明白,想了很久了.高手指教?
...全文
717 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
word_wade 2010-10-06
  • 打赏
  • 举报
回复
借用调试,来理解。。。我最开始也不懂,我也是用调试搞明白的。。。这位牛人的思路非常不错。。。很难想到这么好的方法,,,受益匪浅啊。。。
a351357741 2010-02-23
  • 打赏
  • 举报
回复
举例:n=10 0 1 2 3 4 5 6 7 8 9
高度为 6 2 8 7 3 5 9 6 1 4
由最后一个往前推可看出最多拦截数为 3 2 4 3 2 2 3 2 1 1
if(x[j] <x[i]) //
if(d[i]<d[j]+1)//
d[i]=d[j]+1;// 当满足条件时拦截第i个也能拦截第j个及以后所能拦截的最多个数
即d[j]表示能拦截的最多个数 d[j]+1表示拦截d[j]个导弹加上拦截第i个导弹
qepjatdwj 2009-04-08
  • 打赏
  • 举报
回复
Description

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

Input

最多20个整数,分别表示导弹依次飞来的高度(雷达给出高度数据是不大于30000的正整数)

Output

整数M。表示:这套系统最多能拦截 M 枚导弹.


Sample Input


300 250 275 252 200 138 245


Sample Output


5

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧