本想撸完迷宫去上个厕所,却憋了2个小时,解法倒是很简单,但是为啥特么总有傻X把入口堵死。那还走个🔨。
- 不同路径
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?
- 不同路径 II
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
网格中的障碍物和空位置分别用 1 和 0 来表示。 - 最小路径和
给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
不同路径
解题思路
如图机器人只能向右或者向下走,第一步找基准,观察走到[0,1]只有1种走法,走到[1,0]也只要1种走法,所以走到[0,2]...[0,n-1]也只有1种走法只能向右走,同理走到[2,0]...[m-1,0]也只有1种走法,那么走到[1,1]则有2种走法,是[0,1]+[1,0],所以得到dp方程
代码实现
func uniquePaths(m int, n int) int {
dptable:=make([][]int,m)
for i:=0;i<m;i++{
dptable[i]=make([]int,n)
}
for i:=0;i<m;i++{
dptable[i][0]=1
}
for i:=0;i<n;i++{
dptable[0][i]=1
}
for i:=1;i<m;i++{
for j:=1;j<n;j++{
dptable[i][j]=dptable[i-1][j]+dptable[i][j-1]
}
}
return dptable[m-1][n-1]
}
不同路径 II
解题思路
同样机器人也是只能向右或者向下走,不同点在于如果有障碍物,就此路不通。dp方程 还是如此,只不过基准值和每次计算当前的路径和时需要判断当前位置是否是障碍物。
代码实现
func uniquePathsWithObstacles(obstacleGrid [][]int) int {
if len(obstacleGrid)==0{
return 0
}
m,n:=len(obstacleGrid),len(obstacleGrid[0])
dp:=make([][]int,len(obstacleGrid))
for i:=0;i<m;i++{
dp[i]=make([]int,len(obstacleGrid[i]))
}
for i:=0;i<m && obstacleGrid[i][0]==0;i++{
dp[i][0]=1
}
for i:=0;i<n&&obstacleGrid[0][i]==0;i++{
dp[0][i]=1
}
for i:=1;i<len(obstacleGrid);i++{
for j:=1;j<len(obstacleGrid[i]);j++{
if obstacleGrid[i][j]==0{
dp[i][j]=dp[i][j-1]+dp[i-1][j]
}
}
}
return dp[m-1][n-1]
}
最小路径和
解题思路
从左上角到右下角也是只能向右或者向下走,不同点在于要求到某个点的最小值
代码实现
func minPathSum(grid [][]int) int {
m,n:=len(grid),len(grid[0])
dp:=make([][]int,len(grid))
for i:=0;i<m;i++{
dp[i]=make([]int,len(grid[i]))
}
dp[0][0]=grid[0][0]
for i:=1;i<n;i++{
dp[0][i]=dp[0][i-1]+grid[0][i]
}
for i:=1;i<m;i++{
dp[i][0]=dp[i-1][0]+grid[i][0]
}
for i:=1;i<m;i++{
for j:=1;j<n;j++{
dp[i][j]=min(dp[i-1][j],dp[i][j-1])+grid[i][j]
}
}
return dp[m-1][n-1]
}
func min(a,b int)int{
if a>b{
return b
}
return a
}