class Solution {
public int uniquePaths(int m, int n) {
if(m==1&&n==1){
return 1;
}
int dp[][]=new int[m][n];
for (int i = 0; i < n; i++) {
dp[0][i]=1;
}
for (int i = 1; i < m; i++) {
dp[i][0]=1;
for (int j = 1; j < n; j++) {
dp[i][j]=dp[i-1][j]+dp[i][j-1];
}
}
return dp[m-1][n-1];
}
}
暴力枚举
public int minPathSum(int[][] grid) { int n=grid.length;//行 int m=grid[0].length;//列 if (n==0&&m==0){ return 0; } return helper(n,m,grid); } private int helper(int n, int m, int[][] grid) { if(n==0&&m==0){ return grid[0][0]; }else if(n==0){ return helper(n,m-1,grid)+grid[n][m]; }else if(m==0){ return helper(n-1,m,grid)+grid[n][m]; } return Math.min(helper(n-1,m,grid),helper(n,m-1,grid))+grid[n][m]; }优化
剪枝
class Solution { public int minPathSum(int[][] grid) { int n=grid.length;//行 int m=grid[0].length;//列 int dp[][]=new int[n+1][m+1]; for (int rows[]: dp) { Arrays.fill(rows,-1); } if (n==0&&m==0){ return 0; } return helper(n-1,m-1,grid,dp); } private int helper(int n, int m, int[][] grid, int[][] dp) { if(dp[n][m]!=-1){ return dp[n][m]; } if(n==0&&m==0){ return grid[0][0]; }else if(n==0){ dp[n][m]=helper(n,m-1,grid, dp)+grid[n][m]; return dp[n][m]; }else if(m==0){ dp[n][m]=helper(n-1,m,grid, dp)+grid[n][m]; return dp[n][m]; } dp[n][m]=Math.min(helper(n-1,m,grid, dp),helper(n,m-1,grid, dp))+grid[n][m]; return dp[n][m]; } }自底向上的动态规划
class Solution { public int minPathSum(int[][] grid) { //base case int n=grid.length; int m=grid[0].length; int dp[][]=new int[n+1][m+1];//左上角到[i][j]的最短步数(带权值) //base case dp[0][0]=grid[0][0]; for (int i = 1; i < m; i++) { dp[0][i]=dp[0][i-1]+grid[0][i]; } for (int i = 1; i < n; i++) { dp[i][0]=dp[i-1][0]+grid[i][0]; } for (int i = 1; i



