[动态规划]拦截导弹问题的一个疑问,没看懂解答

weichuang2 2012-07-30 05:19:38
这个经典题目是:

【问题描述】
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然
它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到
敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000 的正整数),计算
(1)这套系统最多能拦截多少导弹
(2)如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。

问题1就是求求最长非升子序列问题,标准的动态规划
问题2如何求解呢? 我看网上的答案都是这样说的:"其实认真分析一下题就回发现:每一个导弹最终的结果都是要被打的,如果它后面有一个比它高的导弹,那打它的这个装置无论如何也不能打那个导弹了,经过这么一分析,这个问题便抽象成在已知序列里找最长上升序列的问题。"

可是我实在是没有看明白,这个所谓的"这个问题便抽象成在已知序列里找最长上升序列的问题"是怎么分析出来的,大家能解释一下么?
...全文
469 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
weichuang2 2012-07-31
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

就是把最长上升子序列反过来,求最长下降子序列,前两天刚好解过这个问题,lz可以看看这个帖子:

http://www.51nod.com/question/index.html#questionId=160

用二分找的话,可以优化到n*log(m),其中m是队列的长度。
[/Quote]

我觉得这个帖子的内容有问题:
“我想到的是一个N*logn(M)(M为最终不下降序列的长度)复杂度的解法!

首相遍历一下这个数组,之后记录一个不下降序列的数组A,遇到一个数字a,就在中查找大于a的数据,如果没有就向A中添加a,这里的复杂度就是(Log(M)),这样循环走一遍序列就可以得到一个不下降序列了,A的长度就是解了”

这个要写成伪代码根本写不出来。
绿色夹克衫 2012-07-31
  • 打赏
  • 举报
回复
我修改了一下帖子里面的内容,你再看看吧。
绿色夹克衫 2012-07-30
  • 打赏
  • 举报
回复
就是把最长上升子序列反过来,求最长下降子序列,前两天刚好解过这个问题,lz可以看看这个帖子:

http://www.51nod.com/question/index.html#questionId=160

用二分找的话,可以优化到n*log(m),其中m是队列的长度。
I'm Daniel Du 2012-07-30
  • 打赏
  • 举报
回复
sorry,T_T,即最长上升子序列就是这个偏序集的
I'm Daniel Du 2012-07-30
  • 打赏
  • 举报
回复
厄,应该是基础知识我就写了.
  • 打赏
  • 举报
回复
mark,有时间回去看看,我开始也想当然了。

[Quote=引用 1 楼 的回复:]

这涉及组合数学中的Dilworth定理.
基础知识我就写了.(T_T,理解基础知识的就不用看下面的内容了.)
关键之处在于证明不上升子序列的划分数=最长上升子序列的长度.
定义一个偏序关系≤:a≤b表示a比b出现的早且a的值大于等于b的值.即最长上升子序列就是这个偏序集的链,因为后面的元素肯定比前面的大啊,无法利用这个偏序关系比较.它的不上升子序列是偏序集的链.由Dilworth定理不上升……
[/Quote]
I'm Daniel Du 2012-07-30
  • 打赏
  • 举报
回复
这涉及组合数学中的Dilworth定理.
基础知识我就写了.(T_T,理解基础知识的就不用看下面的内容了.)
关键之处在于证明不上升子序列的划分数=最长上升子序列的长度.
定义一个偏序关系≤:a≤b表示a比b出现的早且a的值大于等于b的值.即最长上升子序列就是这个偏序集的链,因为后面的元素肯定比前面的大啊,无法利用这个偏序关系比较.它的不上升子序列是偏序集的链.由Dilworth定理不上升子序列的最小划分数=最长上升子序列的长度.

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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