算法设计课第十一周作业

题目描述

在这里插入图片描述

在这里插入图片描述


解决方案

一开始看到这道题想到的是高中的时候学的排列组合问题,但是用排列组合的方法来解决太过于复杂了,不仅时间复杂度比较高,而且过程中空间占用比较大,很可能会溢出。经过分析发现这是一个基本的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];
    }
}; 

猜你喜欢

转载自blog.csdn.net/weixin_38873581/article/details/86518541