动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。
例如我们所知的斐波那契数列,第五项由第四项和第三项得出,第四项又由第三项和第二项求出,以此类推。每个点的状态都由之前的一个或多个点的状态推导出来。
代码随想录作者中,总结了动态规划五部曲:
搞清楚dp数组的含义
求得递推公式
对数组中某些点初始化
确定遍历顺序
打印dp数组(同时也有利于检查)
我们在学习递归时一定会接触到汉诺塔和青蛙跳台阶的例子,这里我们用青蛙跳台阶的例子就很经典。
题目:假设青蛙一次可以跳1或2节台阶,那么跳到指定的一层又多少种方法?
看到题目可能会这样想:先跳1节然后2节...不断地尝试,最后自己都弄混了,那么我们可以根据题目来思考一下。
题目要求得的是跳到某节台阶的方法数,那跳到这里必然从n-1节或者n-2节台阶跳上来,因为一次只能跳1或2节,那么再进一步猜测,n-1节台阶也是从n-2节台阶或者n-3节台阶跳上来的,这符合我们动态规划的状态推导。所以我们猜测用动态规划解决。
第一步.dp[i]是跳到第i节台阶的步数
第二步.dp[i]=dp[i-1]+dp[i-2];
第三步.i=1时越界了,i=2时,没有dp[0]无意义,所以我们初始化dp[1],dp[2]即可
第四步.后面的都是由前面推导出来的,所以我们从前往后遍历
...
代码实现:

这个只是动态规划最基本的案例,在实际解题过程中我们要尽量弄懂题目的意思,根据以上几个步骤逐步去完成。
例如例题2,只能向右或向下走,走一步会消耗当前点位的所给的数值,求走到m,n点的最小花费
根据题目,我们求dp[m][n]只用求从上面一步的最小花费+cost和左边一步最小花费+cost,二者中的最小值。

作者:鲸住我了王晨