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.
Java:
1.二维DP
public class Solution {
public int minPathSum(int[][] grid) {
if(grid==null||grid[0].length==0||grid.length==0) return 0;
int m=grid.length;
int n=grid[0].length;
int[][] res= new int[m][n];
res[0][0]=grid[0][0];
for(int i=1;i<m;i++){
res[i][0]=res[i-1][0]+grid[i][0];
}
for(int j=1;j<n;j++){
res[0][j]=res[0][j-1]+grid[0][j];
}
for(int i=1;i<m;i++){
for(int j=1;j<n;j++){
res[i][j]=Math.min(res[i-1][j],res[i][j-1])+grid[i][j];
}
}
return res[m-1][n-1];
}
}
2.一维DP
http://blog.youkuaiyun.com/linhuanmars/article/details/22257673
递推式是res[i][j]=min(res[i-1][j], res[i][j-1])+grid[i][j]。总共进行两层循环,时间复杂度是O(m*n)。而空间复杂度仍是使用Unique Paths中的方法来省去一维,是O(m),不了解的朋友可以看看哈。代码如下:
public class Solution {
public int minPathSum(int[][] grid) {
if(grid==null||grid.length==0||grid[0].length==0) return 0;
int[] res= new int[grid[0].length];
res[0]=grid[0][0];
for(int i=1;i<grid[0].length;i++)
{
res[i]=res[i-1]+grid[0][i];
}
for(int i=1;i<grid.length;i++)
{
for(int j=0;j<grid[0].length;j++)
{
if(j==0)
res[j]+=grid[i][j];
else
res[j]=Math.min(res[j-1],res[j])+grid[i][j];
}
}
return res[grid[0].length-1];
}
}