题解 | #不同路径的数目(一)#

不同路径的数目(一)

https://www.nowcoder.com/practice/166eaff8439d4cd898e3ba933fbc6358?tpId=295&tqId=685&ru=%2Fpractice%2Ff33f5adc55f444baa0e0ca87ad8a6aac&qru=%2Fta%2Fformat-top101%2Fquestion-ranking&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D295

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

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;
    }
};
全部评论

相关推荐

萧索X:写篮球联赛干嘛,陪老板打篮球吗。还有实习经历要写自己所在岗位具体完成什么工作,自己的任务具体完成了什么需求,给公司带来了哪些量化增长
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务