数学解法不是很理解,能够画出来式子,但是转化为代码计算不是很理解

class Solution {
public:
    /**
     * 
     * @param m int整型 
     * @param n int整型 
     * @return int整型
     */
  //  到达最后一个结点有两种方式,一个向下一个向右这两种
  //  使用递归从后面往前推容易理解
  //  使用动态规划
  //  运用数学 --> 最优解
    int uniquePaths(int m, int n) {
//  递归思路
      if (m == 1 || n == 1) {
        return 1;
      }
      
      //  分别是开头向右走和向下走的结果之和
      return uniquePaths(m - 1, n) + uniquePaths(m, n - 1);

//  动态规划
      //  dp[m][n] 表示在m*n地图中的路径数,求值范围从 1,1 到 m,n
      std::vector<std::vector<int>> dp(m + 1, std::vector<int>(n + 1, 0));
      
      for (int i = 1; i <= m; ++i) {
        for (int j = 1; j <= n; ++j) {
          //  两个if都是边界处,不能用转移方程
          //  同时也可以直接求得,无需状态转移
          if (i == 1) {
            dp[i][j] = 1;
            continue;
          }
          if (j == 1) {
            dp[i][j] = 1;
            continue;
          }
          //  每一结点的路径数都等于其左方和上方结点路径数之和
          dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
        }
      }
      
      return dp[m][n];
//  运用数学
      //  m-1 和 n-1 总步数,对这些总步数进行排列组合。
      //  手动计算出结果表达式,然后算表达式结果
      //  (m+n-2)!/((m-1)!*(n-1)!)
      //防止溢出
      long res = 1; 
      for(int i = 1; i < n; i++)
          res = res * (m + i - 1) / i; 
      return (int)res;
    }
};