[leetcode] 62. 不同路径

62. 不同路径

我们直接用递归来模拟

class Solution {

    public static int cnt;

    public int uniquePaths(int m, int n) {
        cnt = 0;
        dfs(1, 1, m, n);
        return cnt;
    }

    public void dfs(int i, int j, int m, int n) {
        if (i == m && j == n) {
            cnt++;
            return;
        }
        if ((j + 1) <= n)
            dfs(i, j + 1, m, n);
        if ((i + 1) <= m)
            dfs(i + 1, j, m, n);
    }
}

好吧,果然超时了

超在哪了,有些格子做了重复性计算。

其实我们用动态规划来做就简单了:

倒着想,既然机器人只能往右或者往下走,假设机器人已经走到了(i,j),那么机器人只会从左方或者右方走过来的

我们用f[i][j]来描述机器人走到(i,j)的路径数

显然,状态转移方程为:f[i][j] = f[i-1][j]+f[i][j-1]

初始条件是多少呢?当i==j==1时,显然路径数就1个,所有初始条件是f[0][0]=1

最终结果是:f[m-1][n-1]

class Solution {
    public int uniquePaths(int m, int n) {
        int[][] f = new int[m][n];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (i == 0 && j == 0) {
                    f[i][j] = 1;
                }
                if (i - 1 >= 0) {
                    f[i][j] += f[i - 1][j];
                }
                if (j - 1 >= 0) {
                    f[i][j] += f[i][j - 1];
                }
            }
        }
        return f[m - 1][n - 1];
    }
}
posted @ 2018-07-24 21:54 ACBingo 阅读(...) 评论(...) 编辑 收藏