题意:
解题思路:
思路:动态规划状态: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]}