伍六七带你学算法 动态规划 ——不同路径

力扣 62. 不同路径

难度 中等

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
问总共有多少条不同的路径?

在这里插入图片描述

例如,上图是一个7 x 3 的网格。有多少可能的路径?

示例 1:
输入: m = 3, n = 2
输出: 3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
1 向右 -> 向右 -> 向下
2 向右 -> 向下 -> 向右
3 向下 -> 向右 -> 向右

示例 2:
输入: m = 7, n = 3
输出: 28

提示:
1 <= m, n <= 100
题目数据保证答案小于等于 2 * 10 ^ 9

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/unique-paths


本题是一个有关动态规划的题目,首先,动态规划最重要的是掌握他的思想,动态规划的核心思想是把原问题分解成子问题进行求解,也就是分治的思想。

本题中m×n的表格中机器人一定会走m+n-2步,即从m+n-2中挑出m-1步向下走不就行了吗?即C((m+n-2),(m-1))

C(m,n)是数学公式
C(m,n)=m×(m-1)×……×(m-n+1)/n×(n-1)^……3×2×1
C(10,3)=10×9×8/3×2×1

到了本题上这样计算是不是根本不懂怎么用这个公式??

那么我这么说,你应该就懂了→重点!

1.从第一个格子开始,我们每一个格子计算到这个格子的路径数
2.每一个格子的路径数就等于它上面格子和左边格子路径的和
3.第一行和第一列的格子路径数都为1
最后,我们只需要拿到最后一个格子的路径返回即可!
上代码👇

public class _62_不同路径 {

    public static int uniquePaths(int m, int n) {
        int [][]dp = new int[m][n];
        for(int i = 0;i<m;i++){
            for(int j = 0;j<n;j++){
                if(j==0||i==0){
                    dp[i][j]=1;
                }else{
                    dp[i][j]=dp[i][j-1]+dp[i-1][j];
                }
            }
        }
        return dp[m-1][n-1];
    }

    public static void main(String[] args) {

        System.out.println(uniquePaths(7,3));
    }
}

数组只用到上一个状态,因此可以只用一个一维数组,优化空间复杂度

public class _62_不同路径 {

    public static int uniquePaths(int m, int n) {
        int[] dp = new int[n+1];
        for(int i = 0; i < m; i++){
            for(int j = 1; j <= n; j++){
                if(dp[j-1] == 0){    //边界
                    dp[j] = 1;
                }
                else{     //状态转移方程
                    dp[j] = dp[j-1] + dp[j];
                }
            }
        }
        return dp[n];
    }

    public static void main(String[] args) {

        System.out.println(uniquePaths(7,3));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

了迹奇有没

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值