1、动态规划算法步骤(Dynamic Programming)
动态规划算法一般用来求解最优化问题,当问题有很多可行解,而题目要求寻找这些解当中的“最大值”/“最小值”时,通常可以采用DP。
动态规划算法与分治法相似,都是通过组合子问题的解来求解原问题。所不同的是,动态规划应用于子问题重叠的情况,在递归求解子问题的时候,一些子子问题可能是相同的,这种情况下,分治法会反复地计算同样的子问题,而动态规划对于相同的子问题只计算一次。
动态规划算法的设计步骤:
1、刻画最优解的结构特征(寻找最优子结构)
2、递归地定义最优解的值(确定递归公式,动态规划法的重点就是这个)
3、计算最优解的值(有两种方法:带备忘录自顶向下法、自底向上法)
4、利用计算出的信息构造一个最优解(通常是将具体的最优解输出)
2、leetcode上适合用DP求解的问题
题目 | OJ地址 | 目录 |
Triangle |
https://oj.leetcode.com/problems/triangle/ |
3.1 |
Maximum Subarray |
https://oj.leetcode.com/problems/maximum-subarray/ |
3.2 |
Palindrome Partitioning II |
https://oj.leetcode.com/problems/palindrome-partitioning-ii/ |
3.3 |
Minimum Path Sum |
https://oj.leetcode.com/problems/minimum-path-sum/ |
3.4 |
Maximal Rectangle |
https://oj.leetcode.com/problems/maximal-rectangle/ |
3.5 |
Interleaving String |
https://oj.leetcode.com/problems/interleaving-string/ |
3.6 |
Edit Distance |
https://oj.leetcode.com/problems/edit-distance/ |
3.7 |
Decode Ways |
https://oj.leetcode.com/problems/decode-ways/ |
3.8 |
Best Time to Buy and Sell StocI&II&III |
https://oj.leetcode.com/problems/best-time-to-buy-and-sell-stock/ |
3.9 |
Scramble String |
https://oj.leetcode.com/problems/scramble-string/ |
3.10 |
Distinct Subsequences |
https://oj.leetcode.com/problems/distinct-subsequences/ |
3.11 |
Word Break I&II |