您的位置:首页 > 产品设计 > UI/UE

动态规划问题系列---Unique Paths II

2016-09-16 22:07 423 查看

题目

给定一个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]
;
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];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: