机器人位于M x N网格的左上角(下图中标记为“开始”)。
机器人只能在任何时间点向下或向右移动。机器人正试图到达网格的右下角(在下图中标记为“完成”)。
有多少可能的唯一路径?
很简单的动态规划,dp[i][j]表示走到(i,j)有多少条路径
public class Solution {
public int uniquePaths(int m, int n) {
int dp[][] = new int[m+1][n+1];
dp[0][0]=1;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(i==0&&j==0)continue;
if(i==0){
dp[i][j]=dp[i][j-1];
}
else if(j==0){
dp[i][j]=dp[i-1][j];
}
else{
dp[i][j]=dp[i][j-1]+dp[i-1][j];
}
}
}
return dp[m-1][n-1];
}
}
变形题:
“独特路径”的后续行动:
现在考虑是否在网格中添加了一些障碍。有多少条独特的路?
网格中的障碍物和空白区域分别标记为1和0。
例如,
如下图所示,3x3网格中间有一个障碍物。
[
[0,0,0],
[0,1,0],
[0,0,0]
]
唯一路径的总数为2。
注:M和N最多为100。
public class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int n = obstacleGrid.length;
int m = obstacleGrid[0].length;
int dp[][] = new int[n][m];
boolean f = false;
for(int i=0;i<n;i++){
dp[i][0]=1;
if(f){
dp[i][0]=-1;continue;
}
if(obstacleGrid[i][0]==1){dp[i][0]=-1;f=true;}
}
f = false;
for(int i=0;i<m;i++){
dp[0][i]=1;
if(f){
dp[0][i]=-1;continue;
}
if(obstacleGrid[0][i]==1){dp[0][i]=-1;f=true;}
}
for(int i=1;i<n;i++){
for(int j=1;j<m;j++){
if(obstacleGrid[i][j]==1){
dp[i][j]=-1;
}
else{
if(dp[i][j-1]==-1&&dp[i-1][j]==-1) dp[i][j] = -1;
else if(dp[i][j-1]==-1) dp[i][j] = dp[i-1][j];
else if(dp[i-1][j]==-1) dp[i][j] = dp[i][j-1];
else dp[i][j] = dp[i][j-1]+dp[i-1][j];
}
}
}
if(dp[n-1][m-1]==-1) return 0;
return dp[n-1][m-1];
}
}