LeetCode--62.不同路径(排列组合,动态规划)

不同路径(排列组合,动态规划)

1. 题目描述

难度:中等
在这里插入图片描述
在这里插入图片描述

2. 题目分析

这是一道典型的动态规划问题,这道题有两种解法,一种是动态规划,一种是排列组合:
- 动态规划
假设我们要对m=7, n =4的网格进行计算(如下图所示):那么所有可能的路径分为两种,一种是从上方过来的,一种是从左边过来的,就如两个箭头标的方向一致。
在这里插入图片描述
如下图所示,从左边过来的路径的数量和m=6,n=4网格(红色框)的总路径一样,从上边过来的路径的数量和m=7,n=3的网格(蓝色框)的路径数量一样,所以m=7, n =4的网格的数量可以表示为:

nums(m=7, n=3) = nums(m=6, n=3) + nums(m=7, n=2)

在这里插入图片描述
所以动态规划的方程式可以写成:

dp[i][j] = dp[i-1][j] + dp[i][j-1]

- 排列组合
这其实是一道高中我们经常遇到的数学题,我们可以将他转化为数学中的排列组合问题来解决。假设m=7,n=4的网格,我们需要向右移动6步,向下移动3步就能到达终点。至于何时向右何时向下就可以用组合来计算了。就是从9个步里面选出3步走下即可,一个简单的组合问题。

3. C语言实现

3.1 动态规划

代码如下:

int uniquePaths(int m, int n){
    if(m == 1 || n == 1) return 1;
    int res = 0, i, j;
    int dp[m][n];
    // 将单边界的情况赋值为1
    for(i = 0; i < m; i++){
        dp[i][0] = 1;
    }
    for(j = 0; j < n; j++){
        dp[0][j] = 1;
    }
    // 动态规划
    for(i = 1; i < m; i++){
        for(j = 1; j < n; j++){
            dp[i][j] = dp[i-1][j] + dp[i][j-1];
        }
    }
    return dp[m-1][n-1];
}

运行结果为:
在这里插入图片描述

3.2 排列组合

代码如下:

int uniquePaths(int m, int n) {
    int N=m+n-2;
    int M=m<n?m-1:n-1;
    //计算 C(N,M)
    //根据:C(N,M)=C(N,M-1)*M/(N-M+1);
    long ans=1;
    for(int i=1;i<=M;i++)
        ans=ans*(N-i+1)/i;
    return ans;
}

运行结果为:
在这里插入图片描述

发布了163 篇原创文章 · 获赞 188 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/qq_42580947/article/details/104973401