一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
问总共有多少条不同的路径?
例如,上图是一个7 x 3 的网格。有多少可能的路径?
说明:m 和 n 的值均不超过 100。
示例 1:
输入: m = 3, n = 2 输出: 3 解释: 从左上角开始,总共有 3 条路径可以到达右下角。 1. 向右 -> 向右 -> 向下 2. 向右 -> 向下 -> 向右 3. 向下 -> 向右 -> 向右
示例 2:
输入: m = 7, n = 3 输出: 28
class Solution {
public:
/*
f(x,y) = 1 {x==m,y==n-1 or x==m-1,y==n}
f(x,y) = f(x+1,y) {y==n}
f(x,y) = f(x,y+1) {x==m}
f(x,y) = f(x+1,y)+f(x,y+1)
help[][]用于记忆化搜索
*/
int dp(int x, int y, int m, int n, vector<vector<int>> &help){
if(help[x][y]!=-1)
return help[x][y];
if((x==m && y==n-1) || (x==m-1 && y==n)){
help[x][y] = 1;
return 1;
}
if(y==n)
return help[x][y] = dp(x+1,y,m,n,help);
if(x==m)
return help[x][y] = dp(x,y+1,m,n,help);
return help[x][y] = dp(x+1,y,m,n,help)+dp(x,y+1,m,n,help);
}
int uniquePaths(int m, int n) {
vector<vector<int>> help(m+1,vector<int>(n+1,-1));
return (m==n && m==1)? 1 : dp(1,1,m,n,help);
}
};
class Solution:
def dp(self,x,y,m,n,help):
if help[x][y]!=-1:
return help[x][y]
if (x==m-1 and y==n) or (x==m and y==n-1):
help[x][y] = 1
elif x==m:
help[x][y] = self.dp(x,y+1,m,n,help)
elif y==n:
help[x][y] = self.dp(x+1,y,m,n,help)
else:
help[x][y] = self.dp(x+1,y,m,n,help) + self.dp(x,y+1,m,n,help)
return help[x][y]
def uniquePaths(self, m, n):
"""
:type m: int
:type n: int
:rtype: int
"""
help = [[-1 for _ in range(n)] for _ in range(m)]#注意下m,n的顺序
m -= 1
n -= 1
if m==n and m==0:
return 1
return self.dp(0,0,m,n,help)