动态规划问题系列---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]; }
相关文章推荐
- 动态规划小结 - 二维动态规划 - 时间复杂度 O(n*n)的棋盘型,题 [LeetCode] Minimum Path Sum,Unique Paths II,Edit Distance
- [LeetCode] Unique Paths && Unique Paths II && Minimum Path Sum (动态规划之 Matrix DP )
- LeetCode之“动态规划”:Minimum Path Sum && Unique Paths && Unique Paths II
- [LeetCode] Unique Paths && Unique Paths II && Minimum Path Sum (动态规划之 Matrix DP )
- 【Leetcode长征系列】Unique Paths II
- 【LeetCode-面试算法经典-Java实现】【063-Unique Paths II(唯一路径问题II)】
- leetcode 213. House Robber II 入室抢劫 抢劫问题 + 一道经典的DP动态规划问题
- 动态规划:背包问题(DP系列)
- leetCode系列----Unique Paths II
- 动态规划系列问题-最长公共子串
- LeetCode.55(45) Jump Game && II (经典的动态规划问题)
- 【LeetCode-面试算法经典-Java实现】【063-Unique Paths II(唯一路径问题II)】
- 动态规划问题系列---Disk Schedule
- 斐波那契系列问题的递归和动态规划
- [leetcode刷题系列]Unique Paths II
- LeetCode之“动态规划”:Unique Binary Search Trees && Unique Binary Search Trees II
- 动态规划问题系列---Labyrinth(迷宫)
- 动态规划问题系列---连续子数组(二维)的最大和
- 斐波那契系列问题的递归和动态规划3
- DP问题:leecode(63) Unique Paths II