题目描述
一个机器人位于一个 m x n
网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角。
问总共有多少条不同的路径?
示例 :
输入:m = 3, n = 7 输出:28
思路
暴力算法就是深搜了,把每条路径都遍历一遍。
代码如下:
时间复杂度达到O(2^(m+n)),显然超时了。
动态规划
确定dp数组:
dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。
状态转移方程:想要求dp[i][j],只能有两个方向来推导出来,即dp[i - 1][j] 和 dp[i][j - 1],那么很自然,dp[i][j] = dp[i - 1][j] + dp[i][j - 1],因为dp[i][j]只有这两个方向过来。得到:
dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
初始化:dp[i][0]=1,dp[0][j]=1。
解法
C++代码
Java代码
拓展
可以使用滚动数组,将空间复杂度从O(n^2)降到O(n)。