题目
题干
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
数据规模
1 <= m, n <= 100
- 题目数据保证答案小于等于
2 * 109
题解
思路1-动态规划
设map[i][j]
表示下标为(i,j)
的坐标的路径数, 那么为了到达(i, j
), 要么先到达(i-1, j)
或者先到达(i, j-1)
,而到达前者有map[i-1][j]
条路径, 到达后者有map[i][j-1]
条路径, 故很明显有map[i][j]=map[i-1][j]+map[i][j-1]
因此直接用一个dp就可以解决, 最后答案ans = map[m-1][n-1]
这应该是比较省时的解法了, 量级为mn
思路2-递归
我们将思路1中的map[i][j]
看作是一个函数func(i, j)
,那么有:
f
u
n
c
(
i
,
j
)
=
{
1
,
i
=
=
0
1
,
j
=
=
0
f
u
n
c
(
i
−
1
,
j
)
+
f
u
n
c
(
i
,
j
−
1
)
o
t
h
e
r
s
\Large func(i, j) = \left\{ \begin{array}{lr} 1, & i==0 \\ 1, & j ==0 \\ func(i-1,j)+func(i,j-1) &others \end{array} \right.
func(i,j)=⎩⎪⎪⎨⎪⎪⎧1,1,func(i−1,j)+func(i,j−1)i==0j==0others
那么答案ans = func(m-1, n-1)
但是这种解法肯定超时, 因为数量级是n!+m!
代码实现
/*
* 思路1
*/
class Solution {
public:
int MAXN = 100;
int uniquePaths(int m, int n) {
int map[MAXN][MAXN];
for(int i=0; i<m; i++){
map[i][0] = 1;
}
for(int j=0; j<n; j++){
map[0][j] = 1;
}
for(int i=1; i<m; i++){
for(int j=1; j<n; j++){
map[i][j] = map[i-1][j]+map[i][j-1];
}
}
return map[m-1][n-1];
};
};
/*
* 思路2, 肯定超时, 这题不建议用递归
*/
class Solution {
int func(int x, int y){
if(x == 0) return 1;
else if(y == 0) return 1;
else return func(x-1, y)+func(x, y-1);
}
int uniquePaths(int m, int n) {
return func(m-1, n-1);
};
};