LeetCode 64. 最小路径和


/**
二维转移方程: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]
}
 */


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值