什么算法题目适合采用动态规划
如果需要求解的是最优值(比如乘积最大,最长公共子序列等),那么第一反应是想到动态规划算法,然后判断是否具备如下特点:
- 是否可以划分为分阶段解决,求每一个阶段的最优值,最后将最后一个阶段的值作为最优值或者是从每个阶段的值中选取最优值。
- 每一个阶段的状态最优值之和前面一个或者几个状态有关(状态转移方程)
如果具备以上两个特点,就可以使用动态规划解决;
举例
Example1
求两个字符串的最长公共子序列(子序列可以不连续),比如abcd和becd最长公共子序列是bcd;
首先看到最长,应该首先想到动态规划算法;
然后涉及到两个字符串,有动态规划解题经验的应该想到对应二维数组下的动态规划;
具体逻辑如下图所示,每一个数字值表示以其横纵坐标结尾的字符串的最长公共子序列;这个值对应的横纵坐标对应的字符如果不相等,则取其上面、左面或者是左上的最大值; 如果相等则取上面、左面以及(左上值+1)的最大值;
Example2:
最长递增子序列
看到最长,依然应该想到动态规划;
首先从第一个元素开始遍历,并且记录以这个元素结尾的最长递增子序列的长度;
下一个元素的值应该是遍历该元素之前的元素,遇见比其小的,则子序列长度可以加1,遍历完成,找到最长的子序列即可;
Example3 最短路径和