leetcode 64.最小路径和 golang实现

描述
给定一个包含非负整数的 mxn网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

说明:每次只能向下或者向右移动一步。

示例:

输入:
[
  [1,3,1],
  [1,5,1],
  [4,2,1]
]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。
思路
动态规划问题 
1. 找到公式
dp[i][j] 表示第i行第j列的最小和
则dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + nums[i][j]
2. 初始值 第0列和第0行 都设置int最大值 int(^uint(0) >> 1)
3. 需要注意的是dp[1][1] = min(dp[0][1], dp[1][0]) + nums[1][1]  不能直接套用公式 否则会变成负数 需要单独判断 dp[1][1] = nums[1][1]
实现
func minPathSum(grid [][]int) int {
	if len(grid) == 0{
		return 0
	}

	intMax := int(^uint(0) >> 1)
	rows := len(grid)
	cols := len(grid[0])

	dp := make([][]int, rows+1)
	dp[0] = make([]int, cols+1)

	for j := 0; j<= cols; j++{
		dp[0][j] = intMax
	}

	for i := 1; i<=rows; i++{
		dp[i] = make([]int, cols+1)
		dp[i][0] = intMax
		for j := 1; j <= cols; j++{
			if i == 1 && j == 1{
				dp[1][1] = grid[0][0]
			}else{
				dp[i][j] = Min(dp[i-1][j], dp[i][j-1]) + grid[i-1][j-1]
			}

		}
	}

	return dp[rows][cols]
}

你可能感兴趣的:(算法,数据结构,go)