题目
给定一个m行n列矩阵,其中0表示空闲,1表示障碍物,求从0,0到m-1,n-1中的可通路径数目;(0表示可通)
分析
动态规划
设dp[i][j]表示从i,j到m-1,n-1的路径个数;
则转移方程:
if(a[i][j]==0)
dp[i][j]=dp[i+1][j]+dp[i][j+1]
else
dp[i][j]=0
初始化
if(a[m-1][n-1]==0)
dp[m-1][n-1]=1;
else
dp[m-1][n-1]=0;
if(dp[i][n-1]==0)
dp[i][n-1]=dp[i+1][n-1];
else
dp[i][n-1]=0;
if(dp[m-1][i]==0)
dp[m-1][j]=dp[m-1][j+1];
else
dp[m-1][j]=0;
实现
public static int uniquePathsWithObstacles(int[][] obstacleGrid){
if(obstacleGrid==null){
return 0;
}
int m=obstacleGrid.length;
int n=obstacleGrid[0].length;
if(obstacleGrid[0][0]==1||obstacleGrid[m-1][n-1]==1){
return 0;
}
int[][] dp=new int[m][n];
dp[m-1][n-1]=1;
//第n-1列
for(int i=m-2;i>=0;i--){
if(obstacleGrid[i][n-1]==0){
dp[i][n-1]=dp[i+1][n-1];
}else{
dp[i][n-1]=0;
}
}
//第m-1行
for(int j=n-2;j>=0;j--){
if(obstacleGrid[m-1][j]==0){
dp[m-1][j]=dp[m-1][j+1];
}else{
dp[m-1][j]=0;
}
}
for(int i=m-2;i>=0;i--){
for(int j=n-2;j>=0;j--){
if(obstacleGrid[i][j]==0){
dp[i][j]=dp[i+1][j]+dp[i][j+1];
}else{
dp[i][j]=0;
}
}
}
return dp[0][0];
}