LintCode动态规划题总结

来源:互联网 发布:淘宝模特招聘是真的吗 编辑:程序博客网 时间:2024/06/04 23:22

不知道什么是动态规划的,传送门在这儿:[干货]动态规划十问十答

动态规划进阶:动态规划:从新手到专家

相信看完上面两个链接的博客后,应该对于动态规划有一个新的认识和了解了。接下来就来看看LintCode上DP(下文我将以DP或者Dynamic Programming表示动态规划)的题目。


我们先通过一道题目来认识一下DP:

109. Triangle

有一个数字三角形,从上往下走,找到一条最短的从根到叶节点的路径,即各个节点上的数字加起来的和最小。比如:

[     [2],    [3,4],   [6,5,7],  [4,1,8,3]]
那么最小的路径和就是2 + 3 + 5 + 1 = 11。

这道题有点类似于求二叉树的最小路径和,但是和二叉树有区别,因为二叉树每个节点只有2个子节点。递归的时候,子递归不会进入兄弟节点的后代。

如果这道题直接套用二叉树的那种递归思想,那我们会写出如下的DFS的代码:

但是这个代码超时了,时间复杂度是O(2^n)。

接下来再用divide & conquer分治法来看这道题:


然并卵,这个解法和DFS的时间复杂度一样,一样会TLE超时

以上方法超时的原因,就在于有些点被访问了不止一次,而是多次,所以我们要加入Hash表,来进行记忆化搜索。代码如下:


这样的代码就是可以AC的。一共有O(n*n)个节点,每个节点只被访问一次,所以总的时间复杂度是O(n*n)。这就是加了记忆化搜索的分治法。

而DP和分治法的区别就在于DP有脑子,去掉了重复的运算。动态规划快,就在于它去掉了重复运算。




0 0
原创粉丝点击