动态规划解题三大步骤
下面讲解不同路径这道题:
class Solution {
public:
int uniquePaths(int m, int n)
{
vector<vector<int>> dp(m,vector<int>(n));
for (int i = 0; i < m; i++)
dp[i][0] = 1;
for (int i = 0; i < n; i++)
dp[0][i] = 1;
for (int i = 1; i < m; i++)
{
for (int j = 1; j < n; j++)
{
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
return dp[m - 1][n - 1];
}
};
递归解法
class Solution {
public:
int uniquePaths(int m, int n)
{
map<pair<int,int>, int> path;
return backFind(path,0,0,m,n);
}
int backFind(map<pair<int, int>,int>& path,int i,int j,int m,int n )
{
//判断当前点的走法数是否已经被计算过
if (path.count({i,j})==1)
{
return path[{i, j}];//返回当前位置对应的走法总数
}
//结束条件:遇到边界或者到达目标点
if (i == m - 1 || j == n - 1)
{
return 1; //注意:回溯过程可以看做从把(m-1,n-1)当做起点计算到(0,0)点的走法总数
}
int right = backFind(path,i+ 1, j, m, n);
int left = backFind(path,i, j+1, m, n);
path[{i, j}] = right + left;//当前i,j位置对应的走法总数
return right + left;
}
};