leetcode_64:最小路径和

这个题目就是典型的动态规划问题,因为每次只能向右或者向下走,所以对于一个矩阵,第一行和第一列的dp值就是前面的值相加得到的和。然后对于剩下的所有节点,其dp值应该是本节点的值和上边节点和左边节点中较小的dp值的和。公式为:

  1. for i=1 to rows dp[0][i] = grid[0][i] + grid[0][i-1] 这是第一行的dp值
  2. for i=1 to columns dp[i][0] = grid[i-1][0] + grid[i][0] 这是第一列的dp值初始化,其中i是从1开始的而dp[0][0] = grid[0][0];
  3. 对剩余的每个网格,dp[i][j] = grid[i][j] + Math.min(dp[i-1][j], dp[i][j-1]);

最后返回dp[rows-1][columns-1]就可以了。完整代码如下L

    public static int minPathSum(int[][] grid) {
        int rows = grid.length;
        int columns = grid[0].length;
        int[][] dp = new int[rows][columns];
        dp[0][0] = grid[0][0];	//起点初始化
        for (int i = 1; i < rows; ++i)		//第一行
            dp[i][0] = grid[i][0] + dp[i-1][0];
        for (int j = 1; j < columns; ++j)	//第一列
            dp[0][j] = grid[0][j] + dp[0][j-1];
        for (int i = 1; i < rows; ++i) {	//剩余节点
            for (int j = 1; j < columns; ++j) {
                dp[i][j] = grid[i][j] + Math.min(dp[i-1][j], dp[i][j-1]);
            }
        }
        //返回终点的dp值
        return dp[rows-1][columns-1];
    }
发布了96 篇原创文章 · 获赞 2 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/reachwang/article/details/103340010