按照方法分类
(三)动态规划问题
思路:四个步骤:
- 问题拆解,找到问题之间的联系,即当前问题受到前面问题的影响
- 状态定义
- 转移方程推导(有一维、二维的dp)
- 具体实现
1、 约瑟夫环问题
2、 剪绳子问题
3、 丑数问题
4、 n个骰子的点数
5、 斐波那契数列
6、 跳台阶
7、 最小花费爬楼梯
- dp[i]=min{dp[i−1],dp[i−2]}+cost[i]}
8、 最长公共子序列
-
当两个数组或者字符串要用动态规划时,可以把动态规划定义成两维的 dp[i][j] ,其含义是在 A[0:i] 与 B[0:j] 之间匹配得到的想要的结果;
-
状态方程
- dp[i][j]=dp[i−1][j−1]+1, 当 text1[i - 1] == text2[j - 1];text1[i−1]==text2[j−1];
- dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])dp[i][j]=max(dp[i−1][j],dp[i][j−1]), 当 text1[i - 1] != text2[j - 1]text1[i−1]!=text2[j−1]
9、 最长公共子串:要连续
子序列可以不连续,子数组一定要连续
10、 一个机器人在m×n大小的地图的左上角(起点)。机器人每次可以向下或向右移动。机器人要到达地图的右下角(终点)。可以有多少种不同的路径从起点走到终点?
11、 把数字翻译成字符串
12、 兑换零钱
- dp[i]表示凑成面额i所需要的最少货币数,dp[i]=min(dp[i],dp[i-a[j]])(a[j]表示货币面额)