思考:
- Unique Path 可以用动态规划和排列组合解
- Unique Path II 可以用动态规划
想法
- 1、对与问题一,排列组合考虑,要走到重点总共有n+m-2步,其中m-1步down和n-1步right,如果在m*n的方格内,选择m-1个down,那么剩下n-1步已经确定,并且唯一确定。所以问题一的解为 Cn−1n+m−2 。动态规划可以理解为dp[i][j] = dp[i - 1][j] + dp[i][j - 1]。当然,因为只用到上一循环的结果,故可以用一维数组解。
- 2、问题二类似问题一的动态规划解法。
代码
问题一
解法一 排列组合
public class Solution {
public int uniquePaths(int m, int n) {
long path = 1;
long rem = 1;
int max = m > n? m: n;
for(int i = max; i < m + n - 1; i++){
path *= i;
rem *= (i - max + 1);
}
return (int)(path / rem);
}
}
解法二 动态规划
public class Solution {
public int uniquePaths(int m, int n) {
int[] dp = new int[n];
for(int i = 0; i < n ; i++)
dp[i] = 1;
for(int i = 1; i < m; i++)
for(int j = 1; j < n; j++)
dp[j] = dp[j] + dp[j - 1];
return dp[n - 1];
}
}
问题二
public class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
if(obstacleGrid.length < 1 || obstacleGrid[0].length < 1
|| obstacleGrid[0][0] == 1)
return 0;
int n = obstacleGrid.length;
int[] dp = new int[m];
dp[0] = 1;
for(int j = 1; j < m; j++)
dp[j] = obstacleGrid[0][j] == 0? dp[j - 1]: 0;
for(int i = 1; i < n; i++){
dp[0] = obstacleGrid[i][0] == 0? dp[0]: 0;
for(int j = 1; j < m; j++)
dp[j] = obstacleGrid[i][j] == 0? dp[j] + dp[j - 1]: 0;
}
return dp[m - 1];
}
}