You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Dynamic programming refers to simplifying a complicated problem by breaking it down into simpler sub-problems in a recursive manner.
Likewise, in computer science, if a problem can be solved optimally by breaking it into sub-problems and then recursively finding the optimal solutions to the sub-problems, then it is said to have optimal substructure.
动态规划
定义
让我们看看维基百科中动态规划的定义,截取其中最关键的一部分
翻译过来就是:动态规划指的是通过把一个问题递归拆解成更加简单的子问题的方式简化一个复杂问题。在计算机科学中,如果一个问题可以通过先拆解成简单子问题,寻递归找到每个子问题的最优解,这样我们就可以认为这个问题存在最优子结构。
本质
分治+最优子结构(每步选最优,淘汰次优)
动态规划“三板斧”
分治,找到最优子结构
opt[n]=best_of(opt[n-1], opt[n-2], ...)
状态定义,i 条件时的状态
f[i]
DP方程,也就是递推公式,例如一维的斐波那契递推公式
dp[i] = dp[i-1] + dp[i-2]
二维递推公式例如
dp[i][j] = max(dp[i-1][j], dp[i][j-1])
,高级的DP公式可能会达到三维甚至三维以上经典问题
62.Unique Path
思路:
暴力递归,指数级时间复杂度
DP
a. 分治(子问题) path = path(top) + path(left)
b. 状态定义
f[i, j]
表示第i行第j列的不同路径数c. DP方程
dp[i][j] = dp[i-1][j] + dp[i][j-1]
代码
对于我们的DP公式
dp[i][j] = dp[i-1][j] + dp[i][j-1]
,我们还可以继续优化,因为求的是到达终点的不同路径,我们没必要保存到每行每列任意点的不同路径数,其实只需要保存每一行任意点的路径数即可,DP方程可以更新为dp[i] = dp[i] + dp[i-1]
1143.最长公共子序列LCS
思路:
暴力
DP
a. 分治
LCS[i] = max(LCS(最后一个字母相同),LCS(最后一个字母不相同))
b. 状态定义
f[i][j]
第一个字符串索引 0-i 构成的子串与第二个字符串索引 0-j 子串的最长公共序列c. DP方程
Java 实现
The text was updated successfully, but these errors were encountered: