本节通过一个求不同路径的实例,再次巩固二维动态规划的基础.
问题描述:
一个机器人位于一个m*n网格的左上角,机器人每次只能向下或者向右移动一步.机器人试图到达网格的右下角,问总共有多少种不同的路径?mhen的值均不超过100.
动态规划算法思路解析:
首先理解题目.机器人每次只能向下或者向右走一步,求起点到终点的路径数.那么当机器人处于某一网格时,要么来自上侧网格,要么来自左侧网格,因此到当前网格的路径数为到上册网格的路径数与到左侧网格的路径之和.由此可见,这是一个有子结构的问题,适合采用动态规划算法.
一般来说,解决这种二维的网格空间问题,需要定义一个二维数组来表示到达的位置是二维网格中的哪一个网格.因此下面来定义一个二维数组:
dp变量:表示一个m*n的二维数组,用于保存到m*n的网格中任意一个的路径数量
该二维数组的初始状态就是第一行和第一列为1.显而易见,想要到达网络的第一行或者第一列都只有一种路径,到达第一行只能向右走,到达第一列只能向下走,因此初始化时,第一行第一列初始化为1,其他位置为0.
完整代码如下:
def uniquePaths(self, m, n):# 初始化一个二维数组dp,用来存储到达每个点的路径数dp = []for i in range(n): # 遍历列dp.append([0]*n) # 每一行都初始化为0for i in range(n): # 再次遍历列dp[i][0] = 1 # 第一列的每个点的路径数为1,因为只能从上面来dp[0] = [1]*m # 第一行的每个点的路径数为1,因为只能从左边来for i in range(1, n): # 从第二行开始遍历for j in range(1, m): # 从第二列开始遍历# 到达dp[i][j]的路径数是上面和左边格子的路径数之和dp[i][j] = dp[i-1][j] + dp[i][j-1]return dp[n-1][m-1] # 返回右下角格子的路径数,即最终结果