目录
前言
下面的概念和公式可能会吓到你,看不懂没关系,就是让你恶心的。反正我看着也挺恶心,专业就是让你看不懂,看懂了怎么能叫专业呢?
动态规划(dynamic programming) DP
解决策过程(decision process)最优化的数学方法
动态规划实际上是一类题目的总称,并不是指某个固定的算法。动态规划的意义就是通过采用递推(或者分而治之)的策略,通过解决大问题的子问题从而解决整体的做法。动态规划的核心思想是巧妙的将问题拆分成多个子问题,通过计算子问题而得到整体问题的解。而子问题又可以拆分成更多的子问题,从而用类似递推迭代的方法解决要求的问题。
从1+1开始
比如:有这么一棵树,求AB AC 两条路径的最小值,很简单吧:求A+B,A+C最小值
同理,如下树:很简单吧:求B+D,B+E 最小值
组合一下:求A到叶子节点的最近距离
A+B(子树) 和 A+C(子树) 的最小值吗
B子树 不也是 B+D,B+E的最小值
C子树类似
总结下概念
不然不好描述:
树的路径最小值:一棵树的所有路径最小值我
计算方法:树的路径最小值 = 根节点 + 左右子树的路径最小值
这就是:数塔取数问题,有啥用?
再实际一步:假如E和F数值一样,是不是可以合并成这样。解决办法一样
类似(多了几个节点而已):
变形(值不在节点上了,而是在路径上):
A到B = 6km
A到C=1km
问题:A-H的最近距离
分解:
X = B到H的最近距离+ A到B的距离
Y = C到H的最近距离 + A到C的距离
X 和 Y求最小值
B到H的最近距离:
X1 = D到H的最近距离 + B到D距离
Y1 = E到H的最近距离 + B到E距离
X1 和 Y1 求最小值
D到H的最近距离:只有一条路,当然也是最近,距离为10
这不就是导航吗?
地图到图
百度地图导航:延平门导航到烽火科技园,并使用“测距”:
给每个路口标记,并勾勒路线:
抽象为数据结构图,并标记路径距离,单位M:问题,求1-6的最短距离
复杂的导航无非点多几个,层级多,但如果用1W台计算机支持呢,这点计算就是毛毛雨。
回头看
在看公式,是不是能懂几分了。 区别是:上面是列表,但存储图也可以其他数据结构,下边是用数组存储,下标的Fi,j也是标识第i行第j列的节点。数据公式就是抽象概念或者思想的描述,而咱们的教学大部分直接从 公式入手,让咱们自己去理解上面一大串,也是难为我们了。当然么有公式可以不,可以,但很不方便,就跟没有了成语,需要说半天才能清楚,或者也说不清楚。 如果从公式直接看不出抽象的东西,也不着急,多自己走走上面的步骤,在试图给别人说,你是不是也想找一种描述方式,不然很难说清。
代码
代码能力强的话,代码已经出来了。
可以看出上面是找路径的问题,是在图的基础上做的, 图怎么存储直接影响后边的代码。这里就累赘了。 动态规划又分治的思想,就比如这个代码实现,就又很多小问题组成,数组,列表,邻接表,递归,熟悉了这些自然不是问题。 计算机本身就是分治的思想体现。问题来了,如果不能拆分的呢,比如思想,拆不开,拆开了也合并不在一块了,这种问题就是当前计算机解决不了的问题。学习算法,1是对编码能力的锻炼,2就是学习解决问题的思路和思想。
动态规划经典问题
数塔取数问题 (√ 本次解决)
矩阵取数问题(√ 本次解决)
编辑距离
背包问题
最长递增子序列
最大子段和
最长公共子序列Lcs
正整数分组
具体问题描述和实现可以参考博文: