(Medium)不同路径
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。

问总共有多少条不同的路径?

例如,上图是一个7 x 3 的网格。有多少可能的路径?

示例 1:

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

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

提示:

1 <= m, n <= 100
题目数据保证答案小于等于 2 * 10 ^ 9

来源:力扣(LeetCode
链接:https://leetcode-cn.com/problems/unique-paths
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解:

class Solution {

    int[][] dp;

    public int uniquePaths(int m, int n) {
        // start:21:25 end:21:40
        if (m == 1 && n == 1) {
            return 1;
        }

        dp = new int[m][n];
        for (int i=0; i<m; i++) {
            for (int j=0; j<n; j++) {
                dp[i][j] = -1;
            }
        }

        if (m > 1) {
            dp[1][0] = 1;
        }
        if (n > 1) {
            dp[0][1] = 1;
        }
        dp[0][0] = 0;
        return find(m, n , m-1, n-1);
    }

    private int find(int m, int n, int x, int y) {
        if (x >= m || y >= n || x < 0 || y < 0) {
            return 0;
        } 
        if (dp[x][y] != -1) {
            return dp[x][y];
        }
        int ret = find(m, n, x-1, y) + find(m, n, x, y-1);
        dp[x][y] = ret;
        return ret;
    }
}

分析: 经典动态规划