用二分法优化动态规划,加速决策过程

文章通过导弹拦截系统的问题引出最长不下降子序列问题,介绍了从暴力解法到动态规划的优化过程。首先,通过枚举和搜索方法,发现其时间复杂度无法接受。然后,通过感性认识,得出所有位置都可能是答案的结尾,从而引出动态规划的思路。接着,给出动态规划的转移方程,实现线性时间复杂度的解决方案。最后,利用二分查找进一步优化动态规划,将时间复杂度降低到。文章鼓励读者理解算法背后的推导过程,以便应对类似问题。
摘要由CSDN通过智能技术生成

这道题就是导弹拦截系统,说是某一个国家开发了一套导弹拦截系统,这个拦截系统可以拦截敌国打来的导弹。不同射程的导弹在弹射出去的时候的飞行高度都不同,这个拦截系统可以从低到高拦截飞来的导弹,但是它下一次拦截的高度必须大于等于上一次高度,只能升高不能降低。那么请问,假设我们检测到了所有敌国发射的导弹飞行的高度,请问我们最多可以拦截其中多少枚?
上面讲题意讲了这么多,其实用一句话就概括了,就是求一个序列当中最长不下降子序列的长度。也有题目反过来求最长不上升子序列,意思是一样的。
暴力解法
我们来看一个例子,假设敌国一共发来了8枚导弹,它们的飞行高度分别是:[65, 158, 170, 299, 300, 155, 207, 389]。
我们用眼睛看看还是蛮容易找出答案的,答案应该是[65, 158, 170, 299, 300, 389]一共6枚导弹,其中的155和207无法拦截。假设我们不知道这是一个动态规划算法,我们怎么想出解法呢?
还是老规矩,我们先从最简单的暴力方法开始思考。最暴力的方法就是枚举这n个数所有可能出现的状态,对于其中的每个元素而言,都有两种状态,一种是拿取,一种是不拿。那么对于一个n个元素的数组而言,显然一共会有个不同的可能。然后我们再依次判断每一种可能性是否合法,保留合法的长度最大的那一个。
当然我们也可以用搜索来做,我们可以在搜索的过程当中排除掉非法的组合,但在极端情况下,比如整个数组升序的时候,那么还是会枚举到所有的情况,那么整体的复杂度依然是。这显然是我们不能接受的。
那我们怎么来找到更好的解法呢?
感性的认识
我们观察和思考一下这个问题,我们会发现在这个问题当中,不同规模的解法应该都是一样的。如果某种方法可以解出长度为1000的序列,那么自然也可以解出长度为5的序列,反之也是一样。所以我们不由地可以想到,那我们从最简单的情况开始入手,能不能找到解法呢?
我们从长度为1的数组开始,显然答案是确定的,就是1.
如果长度是2呢?比如[65, 158],那么我们需要判断一下第二个数能否跟在第一个数后面,也就是说第二个数是否大于等于第一个数,如果成立的话,那答案就是2,否则答案还是1,比如[65, 34],最长的序列就只能是[65]或者[34]。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值