算法设计课第十一周作业

本文探讨了一个经典的动态规划问题,即计算机器人在网格中从左上角到右下角的不同路径数量。通过分析,我们简化了问题,避免了使用复杂的排列组合方法,提出了一种高效的DP算法,并提供了简洁的C++代码实现。

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

题目描述

在这里插入图片描述

在这里插入图片描述


解决方案

一开始看到这道题想到的是高中的时候学的排列组合问题,但是用排列组合的方法来解决太过于复杂了,不仅时间复杂度比较高,而且过程中空间占用比较大,很可能会溢出。经过分析发现这是一个基本的DP问题。
由于机器人只能左右移动,当它到达一个点时,只有两种可能:

  • 下移
  • 右移

因此,我们得到以下状态方程:假设到达点(i, j)的路径数记为P[i][j],则

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

上述方程的边界条件出现在最左边的列(P[i][j - 1]不存在)和最上面的行(P[i - 1][j]不存在)。这些条件可以通过初始化(预处理)来处理——对于所有有效的i, j,初始化P[0][j] = 1, P[i][0] = 1。

代码

class Solution {
    int uniquePaths(int m, int n) {
        if (m > n) return uniquePaths(n, m); 
        vector<int> pre(m, 1);
        vector<int> cur(m, 1);
        for (int j = 1; j < n; j++) {
            for (int i = 1; i < m; i++)
                cur[i] = cur[i - 1] + pre[i];
            swap(pre, cur);
        }
        return pre[m - 1];
    }
};
class Solution {
    int uniquePaths(int m, int n) {
        if (m > n) return uniquePaths(n, m);
        vector<int> cur(m, 1);
        for (int j = 1; j < n; j++)
            for (int i = 1; i < m; i++)
                cur[i] += cur[i - 1]; 
        return cur[m - 1];
    }
}; 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值