LeetCode 62. 不同路径

leetcode acwing

动态规划 \(O(n)\)

image-20201227173137525

设定f[i,j]为从起点到店[i,j]的路径数量,由于机器人只会向下或者向右,所以状态转移关系式很容易求得

\[f[i,j] = f[i-1,j] + f[i,j-1] \]

时间复杂度

\(O(n^2)\)

空间复杂度

\(O(n^2)\)

C++ 代码

class Solution {
public:
    int uniquePaths(int m, int n) {
        if (!n || !m) return 1;

        int f[m + 1][n + 1];
        memset(f, 0, sizeof f);

        f[1][1] = 1;
        for (int i = 1; i <= m; i ++)
        {
            for (int j = 1; j <= n; j ++)
            {
                if (i == 1 && j == 1) continue;
                f[i][j] = f[i-1][j] + f[i][j-1];
            }
        }

        return f[m][n];
    }
};

做一下状态压缩

class Solution {
public:
    int uniquePaths(int m, int n) {
        if (!n || !m) return 1;

        int f[n + 1];
        memset(f, 0, sizeof f);

        f[1] = 1;
        for (int i = 1; i <= m; i ++)
        {
            for (int j = 2; j <= n; j ++)
            {
                f[j] = f[j] + f[j-1];
            }
        }

        return f[n];
    }
};

组合数

机器人到终点一定会走\(m+n-2\)步,其中向右走多少步的可能有\(m-1\)种。所以我们得到

\[C_{m+n-2}^{m-1} \]

代码略

posted @ 2020-12-27 17:42  alexemey  阅读(54)  评论(0)    收藏  举报