力扣(LeetCode)试题62-不同路径 C++代码
题目描述:
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
问总共有多少条不同的路径?
解法一:递归(超过时间限制,通过用例41 / 62 个)
步骤一:递推公式:uniquePaths(m,n) = uniquePaths(m-1,n)+uniquePaths(m,n-1)
步骤二:返回条件:if(m==0 || n==0) return 0; if(m==1 || n==1) return 1;
代码:
class Solution {
public:
int uniquePaths(int m, int n)
{
if(m==0 || n==0) return 0;
if(m==1 || n==1) return 1;
return uniquePaths(m, n-1) + uniquePaths(m-1, n);
}
};
解法二:动态规划
步骤一:递推公式(状态转移方程):Finish[i][j] = Finish[i][j - 1] + Finish[i - 1][j]
步骤二:缓存复用:
for (int i = 0; i<m; i++)
{
for (int j = 0; j<n; j++)
{
if (i == 0 || j == 0) Finish[i][j] = 1;
else Finish[i][j] = Finish[i][j - 1] + Finish[i - 1][j];
}
}
代码:
class Solution {
public:
int uniquePaths(int m, int n)
{
vector< vector<int> > Finish(m, vector<int>(n));
for (int i = 0; i<m; i++)
{
for (int j = 0; j<n; j++)
{
if (i == 0 || j == 0) Finish[i][j] = 1;
else Finish[i][j] = Finish[i][j - 1] + Finish[i - 1][j];
}
}
return Finish[m - 1][n - 1];
}
};