LeetCode——2、动态规划DP

〇、引入

《算法导论》第三版解释如下:
动态规划(dynamic programming)与分治法相似,都是通过组合子问题的解来求原问题(在这里,"programming"指的是一种表格法,并非编写的计算机程序)。……分治法将问题划分为互不相干的子问题,递归地求解子问题,再将他们的解组合起来,求出原问题的解。与之相反的,动态规划应用于子问题重叠的情况,即不同的子问题具有公共的子子问题(子问题的求解是递归进行的,将其划分为更小的子子问题)。在这种情况下,分治法会做许多不必要的工作,它会反复地求解那些公共的子子问题。动态规划算法对每个子子问题只求解一次,将其解保存在一个表格中,从而无需每次求解一个子子问题时都重新计算,避免了这种不必要的计算工作。

.

个人是如何解释“动态规划”?
用类比的方式来解释理解。所以,抛出一个“回家”的问题模型,来理解动态规划。
模型:假如你刚到一个新的城市,租了一间不错的公寓HOME,但是你对这座城市甚至你所在的小区Q一无所知。那么如何从这个城市的某个地方S,最快的回到你的公寓呢HOME?

【解决方案】:

假设你当前处于问题的某个阶段:

原问题:从城市S点,回到公寓HOME

子问题:从所在小区Q里的某个位置R,回到公寓HOME

子子问题:熟悉小区Q的布局。

当前阶段,你经过了一段时间的生活,虽然没有熟悉城市的路线,但是你已经知道了小区Q的布局,你可以保证无论在小区中的任何一个位置,都可以找到最快的回家HOME路线。

那么这时候,你就无需再考虑小区Q内的路线了,你只需要找到从城市内的S点到小区Q的最快路线。

这个阶段,就是动态规划进行问题处理的一个阶段。而这个小区Q,其实是一个概念,它实际上代表你可以快速找到回家路线的区域Q。

所以,经过长时间的熟悉,你所熟悉的区域Q会越来越大,而你不熟悉的区域会越来越小,当问题经过逐渐的推演,这个区域Q终将覆盖城市C,此时,你就找到了从S点到HOME的最短区域。

注:对算法有过研究的,对此模型肯定十分熟悉,这就是“最短单源路径”迪杰斯特拉算法(Dijkstra’s Algorithm),虽然迪杰斯特拉算法被归类为广度搜索或者是贪心算法,但是拿来解释动态规划也是非常合适的,至少我这么觉得。

一、范例1:拦截导弹

A国有一套导弹防御系统,在敌国向国内发射导弹时,该系统会依次发射拦截弹,将飞来的导弹拦截下来。但是这个系统有一个缺陷,它的第n+1发拦截弹会比第n发拦截弹的高度要低。假设此时敌国发射来N发导弹,高度不一,那么一套拦截系统,最多可以拦截多少枚导弹?

问题实质:寻常最长递减子序列

假设N枚导弹飞来次序与高度h[1-8]如下:389,207,155,300,299,170,158,65

解决思路:

原问题:最多拦截多少枚导弹

子问题:从第1枚导弹开始,到第t枚导弹之间,最多能拦截多少枚导弹

子子问题:从第t枚导弹开始,到最后一枚导弹,最多能拦截多少枚导弹。

解析:

我们先从第8个导弹(高度65)开始考虑,第8个导弹之后有多少颗导弹比它高度低?很明显,没有导弹。那么引入一个记录表note[8]=1,表示从第8枚导弹之后(包括第8个导弹),只有1个导弹满足条件;

再思考第7个导弹,第7个导弹的高度是158,比对之后的导弹高度,发现之后只有第8个导弹且高度比之低,引入记录表note[8]=1,则note[7]=1+note[8]=2;说明第7个导弹开始(包括第7个),之后最多可拦截2个导弹;

继续第6个导弹,发现第6个导弹的高度比第7、8个导弹高度都要高,但是note[7]>note[8],所以note[6]=note[7]+1=3;说明第6个导弹之后(包括第6个)可以最多拦截3枚导弹;

继续第5,4个导弹,……,note[5]=note[6]+1=4;note[4]=note[5]+1=5;

当分析到第3个导弹的时候,高度155,我们发现第3个导弹比第4、5、6、7个导弹低,只比第8个导弹高,那么note[3]=note[8]+1=2,即表示如果需要拦截第3个导弹,则之后最多可拦截2个导弹(包括第3个)

重复上述步骤,直到分析到第1个导弹,我们就得到了完整的记录表note[1…8];

其中note中,数值最大的,就是这一连串导弹中我们可以最多拦截的数量

void

https://blog.csdn.net/shihoongbo/article/details/51078862

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值