题解 | #不同路径的数目(一)#

不同路径的数目(一)

http://www.nowcoder.com/practice/166eaff8439d4cd898e3ba933fbc6358

一、动态规划法:

import java.util.*;

public class Solution {
    public int uniquePaths(int m, int n) {
        int[][] dp = new int[m + 1][n + 1];//起点到i,有多少种走法
        //状态转移方程为 dp[i][j] = dp[i-1][j] + dp[i][j-1];
        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                if (i == 1 || j == 1) {
                    dp[i][j] = 1;
                    continue;
                }
                dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
            }
        }
        return dp[m][n];
    }
}

二、深搜法(TLE)

int fm;
    int fn;
    int[][] path;
    boolean[][] isVisted;
    int count = 0;

    //输入起点坐标,dfs深度搜索返回路径值
    void dfs(int sx, int sy) {
        if (sx == fm && sy == fn) {
            count++;
            return;
        }
        if (sx > fm || sy > fn) {
            return;
        }
        if (sx < fm && !isVisted[sx][sy]) {
            isVisted[sx][sy] = true;
            dfs(sx + 1, sy);
            isVisted[sx][sy] = false;
        }
        if (sy < fn && !isVisted[sx][sy]) {
            isVisted[sx][sy] = true;
            dfs(sx, sy + 1);
            isVisted[sx][sy] = false;
        }
    }

    //从(0, 0)到(m-1, n-1)有多少种走法,每次只能向下或向右移动
    public int uniquePaths(int m, int n) {
        fm = m - 1;
        fn = n - 1;
        path = new int[m][n];//路径数组
        isVisted = new boolean[m][n];//访问数组
        dfs(0, 0);
        return count;
    }

三、递归法

public int uniquePaths(int m, int n) {
        if (m == 1 || n == 1)
            return 1;
        return uniquePaths(m - 1, n) + uniquePaths(m, n - 1);
    }
全部评论

相关推荐

预计下个星期就能开奖吧,哪位老哥来给个准信
华孝子爱信等:对接人上周说的是这周
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
昨天 10:46
点赞 评论 收藏
分享
头像
10-16 09:58
已编辑
门头沟学院 Java
点赞 评论 收藏
分享
喜欢走神的孤勇者练习时长两年半:池是池,发是发,我曾池,我现黑
点赞 评论 收藏
分享
2 1 评论
分享
牛客网
牛客企业服务