重难点 #动态规划#
从不同角度理解动态规划,从分类到最终的理解
做题的方法,学习的习惯,建立正确的模型,学着深刻理解弄会一道题。不是做题做得越多越好,思想最重要,深入思考一道题抵得过做十道题。多刷题是必须的,但是高智商地刷题更重要。
(以上为口胡+乱扯)
动态规划百分之八十以上是用递推写的,故划分阶段十分的重要。
#406
F[i] 表示走前i公里的最小花费
F[i]=min(f[i-k]+v[k])(1<=k<=10)
#402
第一问F[i]代表前i枚导弹必须拦截第i枚能够达到的最优值是多少
第二问当k套系统能同时拦截某个导弹,该导弹用离其最近的那一套系统,
当k套系统都不能达到某个导弹的高度,那么另开一套系统。
在求最长不上升子序列或是最长上升子序列等时,
改动的即使if语句中的大小判断符
#403合唱队形←导弹拦截的变形。
#404 轮船问题留作思考题
#405 f 的初值应该选择负无穷←为了找到最大值
例如在第一时刻在很远的地方有一个苹果,但那太远了,在第一时刻达不到这个苹果掉落的地方,但自己的位置是到达了。
这些f的含义必须深刻理解,因为动态规划的代码并不长,而f 的内涵比较深刻。
#408
做动态规划必须找到关键句,
如这题,注意任何车辆都不能超车,即贪心做法在这里是不可取的,
F[i-1]+w[i,i]
F[i-2]+w[i-1,i]
……
这样的时间复杂度是O(n^2)
//为什么动态规划的时间复杂度相对于搜索优秀这么多呢?//
动态规划是多路贪心,按阶段上分多个状态的贪心,基本上就是贪心的升级版。
动态规划相对于分治,分治是没有交集的递推,而动态规划是有交集的递推。
书本9.2请仔细阅读(P120——P121)←动态规划基础及动机
#411机器分配
接下来我们将动态规划的题目进行分类。
这题是资源分配类。
阶段:f[i][j] 前i个公司分配到j个机器能够得到的最优值
状态转移方程 f[i][j]=max{f[i-1][k]+a[i][j-k]} a<=k<=j
几个颜色块儿表示的是f[2][3]的最优解。
如此递推。
天啦噜一个上午就把动态规划入门讲完了,然而我并不能做到自己A题目。
我光速去世
接下来是背包九讲。
0/1背包问题
思路在书本上。
这里记录一下刘大佬姥姥的伪代码。
#416 采药
这是我们在今后主要运用的常规0/1背包写法(二维写法是原始写法)
(2)
对于完全背包来说,每一种物品的数目是没有上限的。意味着我们的一维写法将更为简化.
我们可以看出 0/1背包和完全背包的差别即是第二个循环的顺序。正序的v从1至v是会将f[v]更新的,无限个意味着可以无限用,不断的更新恰好是我们需要的。
结合老师写的表理解。
#417 集合求和
其实这也是一道0/1背包问题,只不过该题求的是方案数,而在这之前我们求的是最高价值。
所以这里我们的状态转换方程为
我们这里直接使用一维的算法。
我表示我一时不能理解。注意一下f[0]=1 ,即在最开始的阶段方法数为1;
由于老师心知肚明渣逼如我是无法理解的,
于是有了二维的演示。
当然输出是f[n][s]。
以上是求方法数的0/1背包。
接下来是求方法数的完全背包。(再这样下去我会死:怎么可以上得这么快。。。)
#质数和分解
每个质数其实就相当于一种物品,没有选择数目的上限。
(学日语都没这么认真地口胡过)
(3)多重背包问题
仔细理解黑皮书上的二进制法。
据说背包九讲到这里难的就结束了,
(4)混合背包,几个if语句了结
(5)二维费用的背包问题
其实只需要加上一维就可以了
#421潜水员的规划,
他带的气缸一个为氧气一个为氮气,这很明显就是多了一维的0/1背包问题。
注意在实现代码的时候两种气体不会为负数。
(6)分组的背包问题。
楼上那个二维费用是加了一维
而分组的背包问题就是加了一个循环(貌似很轻松的样子??)
?/为什么枚举这个物品放在枚举分组的里面//
#//二层循环与第三层的循环是不能互换的,倘若互换了,在计算时会重复//
据说(8)(9)没有什么讲的必要。
下面是老师给的Excel
//动态规划的本质就是递推+记忆化搜索。
递推的思想在动态规划中体现是状态转移方程,就是两个相邻结点的最优情况之间的推导关系。由状态转移方程可以从一个端点推到另外一个端点,再从所有的结点中找出最优解。记忆化搜索就是递推过程中解决了贪心目光短浅的问题,记忆化搜索可以记录下当前结点以前的所有结点的最优解(可以思考下,假如到了一个结点一定就是往这个结点的最优解方向走,因此可以采用记忆化搜索的方式记忆下来)
2、无后效性原则:我们知道,贪心是对面前的选择做出一个选择,选择出当前最诱人的路,这种算法的缺点在于目光短浅,而动态规划则是有点逆推的味道,从终点出发,路过每一个结点都可以求出当前结点到终点的最优解,以后的结点又可以利用这个结点的最优解继续求出最优解,到达终点就求出了答案。
同时,正因为这个原则,我们搜索的时候或者选择算法的时候一定要看看是否在满足无后效性原则。//
上述文字摘自hh大佬的博客
https://blog.csdn.net/qq_39670434疯狂吹爆hh大佬。
嗯对,所以今天就算是动态规划入门了,顺便讲了本来要讲九节课的背包九讲(貌似不难),虽说今天的课时确实是开飞机的存在,上午讲课的时候差点当场去世强行理解那比较玄的的状态转移。
现在做到的题目中其实核心代码就是状态转移的那一句短短的语句,但就是这一句语句,脑子要转好几圈才能提炼出来(查阅大佬的代码)。
对于背包问题,深刻理解0/1背包的思想,剩下的也就是变式,在实现0/1背包的基础上,剩下的题目比较需要注意的应该是一些细节,例如f数组的初值,从何处开始递推,递推中值的改变等等。
假装自己理解了口胡一波。。