1. 题目解析
题目链接:62. 不同路径
这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。
2.算法原理
想要解决这个问题,我们得像个侦探一样,一步步地追踪路径,找出所有可能的走法。接下来,让我们一步步地拆解这个问题,看看怎么找到答案。
动态规划问题还是经典五步走~
一、设定状态表
想象你站在一个棋盘上,你的任务是找出从起点到终点有多少种不同的走法。在这个问题里,我们可以设定一个状态表来记录每一步的可能性。
具体来说,我们用dp[i][j]
来表示到达棋盘上的第i
行第j
列位置时有多少种走法。这样,我们只需要关注当前位置,而不需要考虑之前是怎么走过来的。
二、分析状态转移
现在,假设你站在[i, j]
这个位置,想要知道到达这里有多少种走法。显然,你可能是从上方[i-1, j]
位置走下来的,也可能是从左方[i, j-1]
位置走过来的。
因此,我们可以得出一个结论:到达[i, j]
位置的走法数,就是到达上方位置[i-1, j]
的走法数与到达左方位置[i, j-1]
的走法数之和。用数学公式表示就是:dp[i][j] = dp[i-1][j] + dp[i][j-1]
。
三、初始化状态表
在填表之前,我们需要给状态表一个初始值。通常,我们可以在棋盘的最前面加一列和一行作为辅助结点,来帮助我们进行初始化。
在这个问题里,我们只需要在棋盘的最上方和最左边各添加一个辅助结点,并将左上角的辅助结点dp[0][1]
初始化为1(因为从起点开始只有一种走法)。这样,我们就可以开始填表了。
四、按顺序填表
填表的顺序很关键。由于我们是根据上方和左方的状态来推算当前位置的状态,所以我们需要按照从上到下、从左到右的顺序来填表。这样,当我们填写某个位置时,它上方和左方的位置都已经填好了,我们就可以直接引用它们的结果。
五、找出答案
最后,当我们填完整个状态表后,答案就藏在最后一个位置dp[m][n]
里。这个位置记录了从起点到终点的所有可能走法数。
3.代码编写
class Solution
{
public:
int uniquePaths(int m, int n)
{
vector<vector<int>> dp(m + 1, vector<int>(n + 1));//多开一行一列
dp[0][1] = 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][n];
}
};
The Last
嗯,就是这样啦,文章到这里就结束啦,真心感谢你花时间来读。
觉得有点收获的话,不妨给我点个赞吧!
如果发现文章有啥漏洞或错误的地方,欢迎私信我或者在评论里提醒一声~