public static int uniquePaths(int m, int n){ if(m <= 0 || n <= 0){ return0; } int[][] dp = new int[m][n]; //初始化 for(int i = 0; i < m; i++){ dp[i][0] = 1; } for(int i = 0; i < n; i++){ dp[0][i] = 1; //推导出 dp[m-1][n-1] for(int i = 1; i < m; i++){ for(int j = 1; j < m; j++){ dp[i][j] = dp[i-1][j] + dp[i][j-1]; } } return dp[m-1][n-1]; }
O(n*m)的空间复杂度可以优化成O(min(n, m))的空间复杂度
案例三、二维数组的DP
和案例二差不多,找出一条路径,使得路径上的数字总和为最小
这次不是计算所有可能的路径,而是计算哪一个路径最小,所以关系式找出来为
dp[i][j] = min(dp[i-1][j] dp[i][j-1]) +arr[i][j];
再找出初始值,如果i或j有一个为0,那么就不能用关系式了,此时i-1或j-1为负数,需要赋予初始值
代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
public static int uniquePaths(int[][] arr){ int m = arr.length; int n = arr[0].length; if(m <= 0 || n <= 0){ return0; } int[][] dp = new int[m][n]; dp[0][0] = arr[0][0]; for(int i = 1; i < m; i++){ dp[i][0] = dp[0][i-1] + arr[0][i]; } for(int i = 1; i < m; i++){ for(int j = 1; j < n; j++){ dp[i][j] = Math.min(dp[i-1][j], dp[i][j-1]) + arr[i][j]; } } return dp[m-1][n-1]; }