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.
题目意思:鉴于一米 X ñ网格填充非负数,发现从左上角到右下角其路径最小化沿其路径的所有数字的总和。
注意:您只能在任何时间点向下或向右移动。
显然用dp
dp[i][j]表示从左上到达i,j的最小值
dp[i][j]=min(dp[i-1][j],dp[i][j-1])+a[i][j];
dp[i-1][j]表示从上面过来的
dp[i][j-1]表示从左边过来的
因为当前位置要达到最优 所以要在从上面过来和从左边过来找到最小
初值
dp[0][0]=a[0][0];
dp[0][j>0]=dp[0][j-1]+a[0][j];
dp[i>0][0]=dp[i-1][0]+a[i][0];
复杂度(m*n)
AC代码
public class Solution { public int minPathSum(int[][] grid) { int n=grid.length; int m=grid[0].length; int dp[][]=new int[n][m]; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(i==0){ if(j==0){ dp[i][j]=grid[i][j]; }else{ dp[i][j]=grid[i][j]+dp[i][j-1]; } }else if(j==0){ dp[i][j]=grid[i][j]+dp[i-1][j]; }else{ dp[i][j]=Math.min(dp[i][j-1],dp[i-1][j])+grid[i][j]; } } } return dp[n-1][m-1]; } }