这道题DFS会超时,果断用动态规划。很多类似的题目,都是给出两种操作,问能达到某个目的的话有多少种方法。这种题的话,首先建立一个二维数组dp,这个二维数组最上面的一边初始化为1,最左面的一边初始化为1,这样中间的每个位置都是它上面的值加上左边的值:
class Solution {
public:
int uniquePaths(int m, int n) {
vector<vector<int>> dp(m, vector<int>(n, 0));
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];
}
};
但是这是段犯二的蠢代码……因为我建二维数组的时候直接初始化为1就行了……
class Solution {
public:
int uniquePaths(int m, int n) {
vector<vector<int>> dp(m, vector<int>(n, 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];
}
};