第9章 动态规划初步

  说一说这一章写博客的感受吧!感觉就是写的字太多了,表达的不太清晰,不如其他博主几句话就说明了问题,所以这是要改正的,有的地方回去再看都不一定看的懂,

所以需要改进啊!然后就是总结第9章的事情了,感觉不能再向之前一样完全对照书来总结(这样看书不是更好吗?),所以必须有自己的想法,这样的博客才更有意义。

  动态规划,不同于其他的算法,是一种分析问题的思想,需要深入问题去挖掘(最优子结构、重叠子问题、最优解等等),可能对初学者来说是一道坎,但是不要着急,认真

分析,多看多想就是了(貌似是废话)。从经典的问题说起吧!

  数字三角形,这道题对于没有学到动态规划的人来说可以使用暴力求解法求出(回溯)(最优性剪枝等等),尽管我们使用了非常多的优化方法(显然我没有去考虑233),

但是其效率不高O(2^n)这个时间复杂度不是多项式时间复杂度,自然会超时,所以这就不是暴力能够求出的问题(但是数据规模小的话还是可以的),然后引出了dp(动态规划)

动态规划的两个核心:状态定义、状态转移方程,我们令d(i,j)最底部到前i行j列的最大值,可以得到d(i, j) = max(d(i+1, j), d(i+1,j+1)) + a[i][j],然后答案就是d(1,1)了,

这里不说代码了,具体的可以参考书或者其他博客等等,这里说的内容比较少,主要还是个人的理解,实现需要记忆化搜索或者递推,如果使用递归不记忆的话时间复杂度

会退成O(2^n)然后讲一讲dp的时间复杂度通常怎么求,时间复杂度为状态总数*决策数*决策时间。

  DAG(有向无环图),主要将问题(状态)抽象成一个点,对于不同状态之间的关系连成一条线,然后具体需要求DAG最长、最短路以及还要求字典序,具体的问题有:

嵌套矩形问题:将大的矩形与小的矩形连成一条边,然后求最多的嵌套数。

硬币问题:给n种每种无限多的硬币求出凑成一定额度的最大最小硬币数,将当前额度看成一种状态(注意有的额度但不到,需要设置成-1或者特别开一些空间来解决)。

  然后是多阶段决策,这里多阶段我的理解还不够清晰,我想不同阶段推到下一阶段的意思吧,可能状态不想之前那样简单,转移方程会很多,这是从表面上肤浅的理解,

具体的理解肯定是从阶段入手,这里有物品无限的背包问题与01背包,物品无限与硬币问题相似,是权值最大,01背包十分经典,注意滚动数组在后面减少时空花费的作用。

  后面就是其他类型的动态规划了,从线性结构上说起LIS(最长上升子序列),O(n^2)与O(nlogn),LCS(最长公共子序列),LCS->LIS(在特定条件下),然后就是最优矩阵链乘,

d(i,j) = max(d(i,k)+d(k+1,j)|i<=k<=j)是不是非常的熟悉,还有最优三角剖分......

  下面就是树上动态规划了,往往给出无根树,我们转换成有根就行了,有树的最大独立集、树的重心、树的最长路径,分别是从父子之间考虑、树的重心可以看看其他博客,我了解的

不多,求出一个子树的结点数,然后总的减去这个子树的发现同样也是这个子树的根的另一个子树(晕了)记录最大值,树的最长路径,就是选出所有的点作为根,然后求以这个点

作为根的最长路径,然后汇总,这道题还有dfs的方法,两次dfs就能够求出,自行百度吧!然后就是复杂状态的动态规划,这是从状态定义来讲的了,状态定义需要包含很多东西,

如果有着集合关系的话,我们将状态的二进制压缩然后表示(状态压缩dp),有最优配对,TSP,图的色数,都需要从集合减去一部分等等,对于枚举1-n的集合的集合,时间复杂度为

O(3^n)二项式定理反着用,数论的部分会说。

  其实我更想说的除此之外的内容,动态规划的分析,我们要学会简化问题,抓住主要特征入手,然后可以试着考虑贪心等等其他高效算法,这样能够让我们渐渐的深入问题思考,

然后就是状态定义以及转移方程,这两个都不简单,状态定义首先要准,符合问题的特征,然后不能跃出时空限制,初始化,预处理等等,然后根据状态的定义想出转移的思想,

还有写出转移方程,写出思想更为重要,还有就是动态规划可以辅助其他的算法,或者其他的算法辅助动态规划,这都需要能力与分析,总之,慢慢深入吧!

  可能后面也会说一说更多动态规划的题,综合性更强。

  后面就是数论了,动态规划这一最长的章先过去了,继续努力把!

原文地址:https://www.cnblogs.com/yifeiWa/p/11373780.html