【DP】Minimum Path Sum

来源:互联网 发布:程序员开发工具 编辑:程序博客网 时间:2024/05/18 00:52

Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.

Note: You can only move either down or right at any point in time.

解法:D[i][j]保存(0,0)到(i,j)的最小和,对边缘元素要判断

public class Solution {    public int minPathSum(int[][] grid) {        int len1 = grid.length;        if(len1 == 0) return 0;        int len2 = grid[0].length;        if(len2 == 0) return 0;                int d[][] = new int[len1][len2];                for(int i=0; i<len1; i++){            for(int j=0; j<len2; j++){                d[i][j] = grid[i][j];                if(i==0 && j==0) continue;                if(i==0) d[i][j] += d[i][j-1];                else if(j==0) d[i][j] += d[i-1][j];                else{                    if(d[i][j-1] < d[i-1][j]) d[i][j] += d[i][j-1];                    else d[i][j] += d[i-1][j];                }            }        }        return d[len1-1][len2-1];    }}

改进:使用滚动数组,减少空间复杂度

public class Solution {    public int minPathSum(int[][] grid) {        int len1 = grid.length;        if(len1 == 0) return 0;        int len2 = grid[0].length;        if(len2 == 0) return 0;                int d[] = new int[len2];                for(int i=0; i<len1; i++){            for(int j=0; j<len2; j++){                                if(i==0 && j==0) d[j] = grid[i][j];                else if(i==0) d[j] = d[j-1] + grid[i][j];                else if(j==0) d[j] = d[j] + grid[i][j];                else{                    if(d[j-1] < d[j]) d[j] = d[j-1] + grid[i][j];                    else d[j] = d[j] + grid[i][j];                }            }        }        return d[len2-1];    }}



0 0