-[算法导论]Dynamic Programming总结(没完成)

来源:互联网 发布:数据库定义语言 编辑:程序博客网 时间:2024/06/01 08:55

最近又把算法导论部分的dp看了,感觉看的时候懂,但是遇到新的题目就。。。LeetCode还是赶快刷吧!

综述

第15章首先就说明了dp(主要用于求最优问题)存在的必要性,dp有时(subproblem 有重复)比divide-and-conquer更有效率,主要思路是通过一个

table将重复的计算记录下来,下次再用到的时候直接存取就可以了。

然后给出了dp的4个步骤:


这张主要探讨了以下几个问题:

Rod cutting

问题描述如下

这个问题一看就是个最优问题,实际我们可以不用dp做,就用穷举法,首先这个问题是有最优解结构的,
长度为n分成j和n-j,如果j和n-j都是最优的,则n肯定为最优,其次,最优解的可以用下面的形式来表示

总结出这个递归式以后,可以直接用递归法来求解,

但是这个算法有很多的重复计算,运行时间呈指数级上升,所以这个时候,dp就派上用场了。
常见的dp 有两种模式:top-down with memoization 和 bottom-up method。
首先展示top-down method,
Matrix-chain muliplication


代码很容易看懂,然后就是bottom-up method方法了

最后就是step 4了,怎么恢复原来的路径,通常还需要另外的一个数据结构来存储这种关系。


到这儿就差不多了,这个是最简单的dp情况,因为子问题只有一个。

Matrix-chain multiplication

这个题目在看了上面的可以很简单的总结出来,唯一一个障碍就是step 4,怎样把路径打印出来。
其实难点在于怎么严格证明这些问题。


我们知道Ai*k和Bk*j相乘,需要运算i*k*j次
按照正常分析可以很简单的写出递归式

同时可以用m来记录路径,然后打印出来即可。

打印代码如下


Elements of dynamic programming

这个是dp的理论分析,暂时没有看。

Longest common subsequence

这个就是典型的dp问题了,首先首先问题

下面的定理既证明了dp的适用性,又提供了方法。

根据这,可写出递归式

下面就是伪代码了

最后打印出路径

下面的图很形象的展示出了结果

最后还有Improving the code的讨论,主要是当不需要路径时,直接求结果,可以节省空间
还有就是求c时,实际只需要记录前3个变量即可。

Optimal binary search trees

还没完成。。。


0 0
原创粉丝点击