题目内容
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
示例 1:
输入:m = 3, n = 7
解题思路
递归方法:读题之后的第一判断是用递归来解决这个问题,但以暴力思想实现算法几乎都会中陷阱,Time Limit Error.
dp:本题内容其实与青蛙跳台阶问题没有差别,由题意知机器人只会向右与向下两个方向进行移动,可以得出dp公式dp(x,y)=dp(x-1,y)+dp(x,y-1);其中对于x=0与y=0的特殊坐标,进行一点特殊处理就可以。
公式方法:(无)😃
解题代码
递归代码(超时):
class Solution {
public:
int uniquePaths(int m, int n) {
return d(m, n, 1, 1);
}
int d(int m, int n, int y, int x)
{
int sum = 0;
if (m == y)
return 1;
if (x == n)
return 1;
if (m > y)
sum += d(m, n, y + 1, x);
if (n > x)
sum += d(m, n, y, x + 1);
return sum;
}
};
dp代码:
class Solution {
public:
int uniquePaths(int m, int n) {
vector<vector<int>> t(m, vector<int>(n));
int i = 0;
while (i < m)
{
t[i][0]++;
i++;
}
int j = 0;
while (j < n)
{
t[0][j]++;
j++;
}
t[0][0] = 1;
i = 1;
while (i < m)
{
j = 1;
while (j < n)
{
t[i][j] = t[i - 1][j] + t[i][j - 1];
j++;
}
i++;
}
return t[m - 1][n - 1];
}
};