动态规划

最小路径和

题目来源
思路:
dp(i)(j) 从左上角到(i, j)位置的最小路径
// 当只能竖着走的时候
dp(i)(0) = dp(i-1)(0) + grid[i][0]
// 当只能横着走的时候
dp(0)(i) = dp(0)(i-1) + grid[0][i]
// 当上一步可以通过向右或者向下到当前(i, j)位置的时候
dp(i)(j) = Math.min(dp(i-1)(j), dp(i)(j-1)) + grid[i][j]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
const minPathSum = grid => {
if (grid === null || grid.length === 0 || grid[0].length === 0) return 0
const rows = grid.length
const cols = grid[0].length
const dp = Array.from(new Array(rows), () => new Array(cols).fill(0))
dp[0][0] = grid[0][0]
for (let i = 1; i < rows; i++) {
dp[i][0] = dp[i - 1][0] + grid[i][0]
}
for (let j = 1; j < cols; j++) {
dp[0][j] = dp[0][j - 1] + grid[0][j]
}
for (let i = 1; i < rows; i++) {
for (let j = 1; j < cols; j++) {
dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j]
}
}
return dp[rows - 1][cols - 1]
}

最长上升子序列

最长公共子序列

背包问题

完全背包

最长上升子序列

文章作者: woyao
文章链接: https://chenwoyao.github.io/2021/04/23/数据结构和算法/动态规划/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 woyao的博客