/**
二维转移方程:dp[i][j] = min(dp[i-1][j] , d[i][j-1]) + grid[i][j];
dp[i][j] 为从(0,0)到(i,j)路径最小值
从题目描述就可得到,当前位置的最小值,肯定来自上面([i-1][j])的位置和左面([i][j-1])的位置的最小值加上当前位置的数值
特殊处理:i==0 或者 j==0 只能累加当前列或当前行
二维数组解法:清晰,明确
进阶版:滚动数组
转移方程:dp[j] = min(dp[j], dp[j-1]) + grid[i][j];
dp[j]: 表示当前j列的最小路径
对应二维:dp[j] = dp[i-1][j], dp[j-1] = dp[i][j-1]
*/
// 一维滚动数组
func minPathSum(grid [][]int) int {
// dp[i][j]定位为第i行第j列 min(dp[i-1][j] + grid[i][j], d[i][j-1] + grid[i][j])
var dp [250]int
n, m:= len(grid), 0
if n > 0 {
m = len(grid[0])
}
for i:=0; i<len(grid); i++ {
for j:=0; j<len(grid[i]); j++ {
if i == 0 && j == 0 {
dp[j] = grid[i][j]
} else if i == 0 && j > 0 {
dp[j] = dp[j-1] + grid[i][j]
} else if j == 0 && i > 0 {
dp[j] = dp[j] + grid[i][j]
} else {
dp[j] = min(dp[j], dp[j-1]) + grid[i][j]
}
}
fmt.Println(dp[:m])
}
return dp[m-1]
}
func min(x, y int) int {
if x < y {
return x
}
return y
}
/**
二维解法:
func minPathSum(grid [][]int) int {
// dp[i][j]定位为第i行第j列 min(dp[i-1][j] + grid[i][j], d[i][j-1] + grid[i][j])
var dp [250][250]int
n, m:= len(grid), 0
if n > 0 {
m = len(grid[0])
}
for i:=0; i<len(grid); i++ {
for j:=0; j<len(grid[i]); j++ {
if i == 0 && j == 0 {
dp[i][j] = grid[i][j]
} else if i == 0 && j > 0 {
dp[i][j] = dp[i][j-1] + grid[i][j]
} else if j == 0 && i > 0 {
dp[i][j] = dp[i-1][j] + grid[i][j]
} else {
dp[i][j] = min(dp[i][j-1], dp[i-1][j]) + grid[i][j]
}
}
}
return dp[n-1][m-1]
}
*/
LeetCode 64. 最小路径和
最新推荐文章于 2024-07-16 23:15:32 发布