let mat = [
[1, 1, 0],
[1, 1, 1],
[0, 1, 1]
]
let dp = []
let m=mat.length,n=mat[0].length
for (let i = 0; i < m; i++) {
let temp = []
for (let j = 0; j < n; j++) {
if (mat[i][j] === 0) {
temp.push(0)
} else {
temp.push(Infinity)
}
}
dp.push(temp)
}
//为什么不上下或左右 是因为dp的状态是由以前的状态推导而来 怎么做到遍历前面的状态也遍历后面的状态
//上左
for (let i = 0; i < m; ++i) {
for (let j = 0; j < n; ++j) {
if (i - 1 >= 0) {
dp[i][j] = Math.min(dp[i][j], dp[i - 1][j] + 1);
}
if (j - 1 >= 0) {
dp[i][j] = Math.min(dp[i][j], dp[i][j - 1] + 1);
}
}
}
//右下
for (let i = m - 1; i >= 0; --i) {
for (let j = n - 1; j >= 0; --j) {
if (i + 1 < m) {
dp[i][j] = Math.min(dp[i][j], dp[i + 1][j] + 1);
}
if (j + 1 < n) {
dp[i][j] = Math.min(dp[i][j], dp[i][j + 1] + 1);
}
}
}
console.log(dp);
注意事项:遍历的顺序很重要
这篇博客探讨了一个使用动态规划求解矩阵中最短路径的问题。代码中展示了如何初始化状态数组dp,并通过上左和右下的遍历更新每个位置的最短路径。遍历顺序对于正确计算至关重要。
1726

被折叠的 条评论
为什么被折叠?



