(力扣---动态规划)不同路径

本文介绍了一种使用动态规划解决力扣上的经典题目——不同路径的方法。在一个m×n的网格中,机器人从左上角出发,只能向下或向右移动,目标是到达右下角。文章详细解析了如何通过动态规划算法计算所有可能的路径数量,并提供了Python和C++的实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(力扣—动态规划)不同路径

描述

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
问总共有多少条不同的路径?
在这里插入图片描述
例如,上图是一个7 x 3 的网格。有多少可能的路径?
说明:m 和 n 的值均不超过 100。
示例 1:

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

  1. 向右 -> 向右 -> 向下
  2. 向右 -> 向下 -> 向右
  3. 向下 -> 向右 -> 向右

示例2:

输入: m = 7, n = 3
输出: 28

哇这道题简直经典到爆了
直接贴代码

python code
class Solution:
    '''
    n:行
    m:列
    '''

    def uniquePaths(self, m: int, n: int) -> int:
        dp = [[0 for i in range(m + 1)] for i in range(n + 1)]  # 初始化dp数组 注意第0行和第0列初始化为0 保证下标不越界
        for i in range(1, n + 1):
            for j in range(1, m + 1):
                if i == j == 1:
                    dp[1][1] = 1
                else:
                    dp[i][j] = dp[i - 1][j] + dp[i][j - 1]

        return dp[n][m]

特别说明

这里我想特别说明一下,就是python的语法是非常灵活的,python支持“连续逻辑比较操作”,也就是
if i == j == k: pass
这样的语句是合法的,我看貌似有些人不怎么会活用不同语言的不同于法啊。。。

c++ code
class Solution {
public:
    int uniquePaths(int m, int n) {
        vector<vector<int>> dp(n + 1, vector<int>(m + 1));
        for(int i = 1; i <= n; i++)
            for(int j = 1; j <= m; j++)
                if(i == 1 && j == 1)
                    dp[1][1] = 1;
                else
                    dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
        return dp[n][m];
    }
};
### LeetCode中的动态规划解题思路 在LeetCode上处理动态规划问题时,通常遵循一系列特定的方法论来构建解决方案[^4]。对于这类问题的关键在于理解如何通过子问题的解答组合起来形成最终答案。 #### 识别适合动态规划的问题特征 当遇到一个问题能够被拆分为更小规模相同类型的子问题,并且这些子问题之间存在重叠部分时,则可能适用动态规划方法求解[^5]。这种特性意味着解决问题的过程中会反复遇到相同的中间结果,从而可以通过存储之前的结果减少不必要的重复计算。 #### 定义状态及其转移方程 定义合适的状态表示至关重要,这涉及到选取恰当的数据结构以及确定描述当前情况所需的最小参数集。接着就是寻找不同状态下最优解之间的联系——即所谓的“状态转移方程”,它表达了由前一阶段向下一阶段推进的方式。 #### 实现方式的选择 实现方面可以选择两种不同的策略: - **自顶向下(带记忆化的递归)**:这种方法基于原始想法直接编写函数调用自身解决较小实例的过程,在每次进入新层之前检查缓存看是否有已经算过的值可以直接利用。 - **自底向上(迭代版表格填充)**:此途径则完全摒弃了显式的函数嵌套调用机制转而依靠循环控制逐步累积各个级别的最佳选择直至达到目标位置为止。 #### 示例分析 - 爬楼梯(Leetcode 70) 考虑这样一个简单的例子:“爬楼梯”。给定n阶台阶,一次可以跨1步或2步,请问有多少种不同的走法能到达楼顶?这个问题非常适合用来展示动态规划的应用场景之一。 ```python def climbStairs(n: int) -> int: if n == 1 or n == 2: return n dp = [0]*(n+1) dp[1], dp[2] = 1, 2 for i in range(3,n+1): dp[i]=dp[i-1]+dp[i-2] return dp[n] ``` 上述代码片段展示了如何运用数组`dp[]`保存每一级阶梯对应的路径总数,进而实现了从底部逐级累加直到顶部的整体过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值