题意:
解题思路:
思路:动态规划
状态:dp[i][j] 表示走到格子(i,j) 的方法数。
状态转移方程:
1.1 如果网格 (i,j)上有障碍物,则 dp[i][j]值为 0,表示走到该格子的方法数为0;
1.2 否则网格 (i,j)可以从网格(i−1,j) 或者 网格(i,j−1) 走过来,
因此走到该格子的方法数为走到网格(i−1,j)和网格(i,j−1) 的方法数之和,
即 dp[i,j]=dp[i−1,j]+dp[i,j−1]。
PHP代码实现:
class Solution {
/**
* @param Integer[][] $obstacleGrid
* @return Integer
*/
function uniquePathsWithObstacles($grid) {
$row = count($grid);//行
$col = count($grid[0]);//列
//初始有障碍物直接返回0
$grid[0][0] = $grid[0][0] == 1 ? 0 : 1;
// 如果当前的位置为0,表示当前没有障碍。并且前一步为1,表示前一步没有障碍,走过了就变为1
// 那么这一步就可以变为1,否则就是有障碍,置为0
for ($i = 1; $i < $row; $i++)
$grid[$i][0] = ($grid[$i][0] == 0 && $grid[$i - 1][0] == 1) ? 1 : 0; //先处理行
for ($i = 1; $i < $col; $i++)
$grid[0][$i] = ($grid[0][$i] == 0 && $grid[0][$i - 1] == 1) ? 1 : 0;
for ($i = 1; $i < $row; $i++) {
for ($j = 1; $j < $col; $j++) {
if ($grid[$i][$j] == 0) {
$grid[$i][$j] = $grid[$i-1][$j] + $grid[$i][$j-1];
} else {
$grid[$i][$j] = 0;
}
}
}
return $grid[$row-1][$col-1];
}
}
GO代码实现:
func uniquePathsWithObstacles(grid [][]int) int {
dp := make([][]int, len(grid))
for i := 0;i < len(grid);i++ {
dp[i] = make([]int, len(grid[0]))
}
for i := 0;i < len(grid);i++ {
if grid[i][0] == 1 {
dp[i][0] = 0
break
}
dp[i][0] = 1
}
for i := 0;i < len(grid[0]);i++ {
if grid[0][i] == 1 {
dp[0][i] = 0
break
}
dp[0][i] = 1
}
for i := 1;i < len(grid);i++ {
for j := 1;j < len(grid[0]);j++ {
if grid[i][j] == 1 {
dp[i][j] = 0
continue
}
dp[i][j] = dp[i][j-1] + dp[i-1][j]
}
}
return dp[len(dp)-1][len(dp[0])-1]
}