题目描述
一个棋盘有n行m列,从棋盘的左上角走到右下角,每次只能往右走一步,或者往下走一步,总共有多少种走法?
Input: m = 3, n = 2
Output: 3
总共有三种走法
1.右 -> 右 -> 下
2.右 -> 下 -> 右
3.下 -> 右 -> 右
解题思路
假设将某个格子作为终点,该格子位于第 i i i行第 j j j列,走法总数 = 终点上方格子的走法总数 + 终点左边格子的走法总数。原问题的解包含子问题的解,符合最优子结构的定义,典型的动态规划问题。
写成方程:
s
i
j
=
s
i
j
−
1
+
s
i
−
1
j
s_{ij}=s_{ij-1}+s_{i-1j}
sij=sij−1+si−1j
解题代码
class Solution
{
public:
int maxSize = 200;
int s[200][200];
int uniquePaths(int m, int n)
{
for (int i = 1; i <= m; i++)
{
s[1][i] = 1;
}
for (int j = 1; j <= n; j++)
{
s[j][1] = 1;
}
//填表:从左到右,从上到下
for (int i = 2; i <= n; i++)
{
for (int j = 2; j <= m; j++)
{
s[i][j] = s[i - 1][j] + s[i][j - 1];
//s[i - 1][j] -- 左
//s[i][j - 1] -- 上
}
}
return s[n][m];
}
};
LeetCode链接:LeetCode 62. Unique Paths