【Leetcode】62. 不同的路径(Unique Paths)

Leetcode - 62 Unique Paths (Medium)

题目描述:机器人只能向右或向下移动,给定矩阵的长和宽,求从左上角移动到右下角共有几种不同的路径。

【Leetcode】62. 不同的路径(Unique Paths)_第1张图片

Input: m = 3, n = 2
Output: 3
Explanation:
From the top-left corner, there are a total of 3 ways to reach the bottom-right corner:
1. Right -> Right -> Down
2. Right -> Down -> Right
3. Down -> Right -> Right

解题思路:定义状态 dp[i][j] 为走到第 i 行/第 j 列的不同路径数,dp[m - 1][n - 1] 即为所求。状态方程为 dp[i][j] = dp[i - 1][j] + dp[i][j - 1],每个方块的路径数等于上面与左面方块的路径数之和。由于每次只需要计算上面与左面的方块,可以将存储结构缩减到一维,使用 dp[i] 表示。第一行与第一列的方块路径数均为 1。

public int uniquePaths(int m, int n) { 
    int[] dp = new int[n];
    Arrays.fill(dp, 1);
    for(int i = 1; i < m; i++){
        for(int j = 1; j < n; j++){
            dp[j] += dp[j - 1];
        }
    }
    return dp[n - 1];
}

除此之外,也可以使用数学公式直接求解。机器人总共移动 S = m + n - 2 次,向下移动 D = m - 1 次,问题可以转换成从 S 中取出 D 个位置的组合数量,即 C(S, D)。

public int uniquePaths(int m, int n) {
    int S = m + n - 2; 
    int D = m - 1;
    long ret = 1;
    for (int i = 1; i <= D; i++) {
        ret = ret * (S - D + i) / i;
    }
    return (int) ret;
}

你可能感兴趣的:(LeetCode,动态规划,leetcode,动态规划,DP)