LeetCode 62. 不同路径

排列组合

很快啊,写出了(m+n-2)!/(m-1)!(n-1)!的排列组合公式!
然而由于测试数据的阶乘过大,经过我的多次修改,能通过的测试用例越来越多了,但是依旧没有通过:
LeetCode 62. 不同路径_第1张图片LeetCode 62. 不同路径_第2张图片

最终投降于丑陋的面向答案的编程:
LeetCode 62. 不同路径_第3张图片
在这里插入图片描述
LeetCode 62. 不同路径_第4张图片

其实可以使用乘完立刻除的方式,但是不太有意义…尤其是看到python直接就能过的时候,使用C++写题的我简直是痛苦.jpg,算了,这个方法直接跳过。

动态规划

本题动态规划其实也十分的容易。
同样地,使用以下模板:

  1. 确定dp数组(dp table)以及下标的含义
  2. 确定递推公式
  3. dp数组如何初始化
  4. 确定遍历顺序
  5. 举例推导dp数组
    但是在一开始确定dp数组的时候,错误地将"m+n-2"步,每一步可以有多少条路定成了数组,也即一维的。但是一维的解题非常困难,完全不适合,于是重新变换思路,确定为二维数组,于是很顺利地写出了推导公式、初始化和代码。
class Solution {
public:
    int uniquePaths(int m, int n) 
    {   
        int dp[m+1][n+1];
        for(int i = 0; i < m; ++i)
            dp[i][0] = 1;
        for(int j = 0; j < n; ++j)    
            dp[0][j] = 1;
        for(int i = 1; i < m; ++i)
        {
            for(int j = 1; j < n; ++j)
            {
                dp[i][j] = dp[i][j-1]+dp[i-1][j];
            }
        }
        return dp[m-1][n-1];
    }

   
};

经过标出每一个格子的路径数,这才发现本题是有多么简单,使用刚刚的数学思想是多么的愚蠢(不是)。

1 1 1 1 1
1 2 3 4 5
1 3 6 10 15

你可能感兴趣的:(leetcode,leetcode,算法,职场和发展)