思路:本题类似于LeetCode64. 最小路径和
class Solution { public int uniquePaths(int m, int n) { // dp[i][j] 表示 从(0,0) 到 (i,j)有多少不同的路径 int[][] dp = new int[m][n]; // 第一行都是1 for (int j = 0; j < n; j++) { dp[0][j] = 1; } // 第一列都是1 for (int i = 0; i < m; i++) { dp[i][0] = 1; } for (int i = 1; i < m; i++) { for (int j = 1; j < n; j++) { dp[i][j] = dp[i-1][j] + dp[i][j-1]; } } return dp[m-1][n-1]; /** * 优化:dp空间压缩 * 当前坐标的值只和左边与上面的值有关,和其他的无关 */ // 版本1:按行更新 /* int[] dp = new int[n]; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (j == 0) { dp[j] = 1; continue; } dp[j] += dp[j-1]; } } return dp[n-1]; */ // 版本2:按列更新 /* int[] dp = new int[m]; for (int j = 0; j < n; j++) { for (int i = 0; i < m; i++) { if (i == 0) { dp[i] = 1; continue; } dp[i] += + dp[i-1]; } } return dp[m-1]; */ } }