一、题目描述:
二、思路分析:
动态规划
状态表示 dp[i][j]表示第i行第j列的位置共有几种到达的方法
状态计算 dp[i][j]由左边和上边组成
状态转移方程
dp[i][j] = dp[i][j - 1] + dp[i - 1][j];
根据题意,可以将问题转换成一个图的遍历问题。
深度优先遍历
可以使用一个栈存储点,每次出栈一个点,如果其向右向左的点存在,就入栈,每次遍历到 (m - 1. n - 1)这个点是ret++,最后return ret
广度优先遍历
可以使用一个队列存储点,每次出队一个点,如果其向右向左的点存在,就入队,每次遍历到 (m - 1. n - 1)这个点是ret++,最后return ret
三、AC 代码:
class Solution {
public:
int uniquePaths(int m, int n) {
int dp[m][n];
for(int i = 0; i < m; i ++){
for(int j = 0; j < n ; j ++){
dp[i][j] = 0;
if(i == 0 && j == 0)dp[0][0] = 1;
else if(i == 0 && j != 0)dp[i][j] = dp[i][j - 1];
else if(i != 0 && j == 0)dp[i][j] = dp[i - 1][j];
else{
dp[i][j] = dp[i][j - 1] + dp[i - 1][j];
}
}
}
return dp[m - 1][n - 1];
}
};
四、总结:
这道题还可以通过数学知识来解决,不过这个应该也不算算法的范畴了,掘友们可以自行挖掘。
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情