动态规划之基础dp学习总结


一.动态规划认识


动态规划:动态规划是解决多阶段决策问题的一种方法。动态规划是解决最优化问题的一种途径,但不是一种特殊算法,重点是一个建立状态转移方程的过程。

基本思想:多阶段决策问题,如果一类问题的求解过程可以分为若干个互相联系的阶段,在每一个阶段都需作出决策,并影响到下一个阶段的决策。

动态规划的基本思路
一、判断问题是否可以使用动态规划(判断问题是否具有最优子结构的性质)
二、把问题分成若干个子问题(分阶段)
三、建立状态转移方程(递推关系式)
四、找出边界条件。
五、将已知边界值带入方程。
六、递推求解。

能使用动态规划算法的条件
如果一个问题被划分各个阶段之后,阶段I中的状态只能由阶段I-1中的状态通过状态转移方程得来,与其它状态没有关系,特别是与未发生的状态没有关系,那么这个问题就是“无后效性”的,可以用动态规划算法求解

记忆化搜索
在进行动态规划的时候,有时候我们会遇到多次取用动态方程所解的值,为了减少所运行的时间,我们可以采用一个数组进行保存这些方程值,这样我们就减少运行时间。

动态规划与贪心的区别
贪心算法中,作出的每步贪心决策都无法改变,由上一步的最优解推导下一步的最优解,所以上一部之前的最优解则不作保留。
能使用动态规划算法的条件: 如果一个问题被划分各个阶段之后,阶段I中的状态只能由阶段I-1中的状态通过状态转移方程得来,与其它状态没有关系,特别是与未发生的状态没有关系,那么这个问题就是“无后效性”的,可以用动态规划算法求解。

二.动态规划近期习题总结

1. 数塔问题,金币问题
这类问题的题目大意为:要求找出一条路径,使得路径上的数字之和最大.
算法实现:
I. 首先利用一个二维数组data存储数塔的原始数据,然后利用一个中间数组dp存储每一次决策过程中的结果。
II. 初始化dp,将data的最后一层拷贝到dp中。dp[n][j] = data[n][j] (j = 1, 2, …, n) 其中,n为数塔的层数。
III. 在动态规划过程汇总,我们有dp[i][j] = max(dp[i+1][j], dp[i+1][j+1]) + data[i][j],最后的结果保存在dp[0][0]中。

2.最大连续上升子序列问题
做这种题的思想为:用dp[i]表示i之前的某个位置到i的和(也包括i到i).边界条件为dp[1]=a[1].
具体代码实现为:

 dp[1]=a[1];
 for(int i=2;i<=n;i++)
 {
         if(dp[i-1]<0)dp[i]=a[i];
         else dp[i]=dp[i-1]+a[i];
 }

3.把二维转换为一维的问题例:最大子矩阵和
把这个子矩阵每一列的值相加,压缩成一个一维的数组,对这个数组求其最大子段和,便转化为一维的求最大连续子序列问题。

:对于二维问题,我们经常用dx[]={-1,0,1,0},dy[]={0,1,0,-1}来表示对应的上下左右四个方向。

猜你喜欢

转载自blog.csdn.net/wcxyky/article/details/88857172
今日推荐