原题链接
思路与算法
我们用 表示从左上角走到 的路径数量,其中 和 的范围分别是 和 。
由于我们每一步只能从向下或者向右移动一步,因此要想走到 ,如果向下走一步,那么会从 走过来;如果向右走一步,那么会从 走过来。因此我们可以写出动态规划转移方程:
需要注意的是,如果 ,那么 并不是一个满足要求的状态,我们需要忽略这一项;同理,如果 ,那么 并不是一个满足要求的状态,我们需要忽略这一项。
初始条件为 ,即从左上角走到左上角有一种方法。
最终的答案即为 。
细节
为了方便代码编写,我们可以将所有的 以及 都设置为边界条件,它们的值均为 。
代码
typescript
function uniquePaths(m: number, n: number): number {
const dp = Array.from({ length: m }, () => new Array(n).fill(0));
for(let i = 0; i < m; i++) {
dp[i][0] = 1;
}
for(let i = 0; i < n; i++) {
dp[0][i] = 1;
}
for(let i = 1; i < m; i++) {
for(let j = 1; j < n; j++) {
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
return dp[m - 1][n - 1];
};