关闭

LintCode UniquePaths 不同的路径

1226人阅读 评论(0) 收藏 举报
分类:

中文描述:
有一个机器人的位于一个M×N个网格左上角(下图中标记为’Start’)。
机器人每一时刻只能向下或者向右移动一步。机器人试图达到网格的右下角(下图中标记为’Finish’)。
问有多少条不同的路径?

start 1.2 1.3 1.4 1.5 1.6 1.7
2.1
3.1 3.2 3.3 3.4 3.5 3.6 end

法一:数学公式法
机器人一共要走m+n-2步。
我们要从这m+n-2步中挑出m-1步向下走,或者挑出n-1步向右走。
由于挑出的步数顺序唯一,即不必考虑每步之间顺序,即应使用组合方法而非排列方法。
数序公式为C((m+n-2),(m-1)) = C((m+n-2),(n-1))
注意:计算阶乘可能会超出int甚至long的表达范围。

法二:动态规划方法
第一步:

1 1 1 1 1 1 1

第二步:

1 1 1 1 1 1 1
1 2 3 4 5 6 7

第三步:

1 1 1 1 1 1 1
1 2 3 4 5 6 7
1 3 6 10 15 21 28

如果是二维数组则
dp[i][j] = dp[i-1][j] + dp[i][j-1]
可以看出每一行只使用一次,考虑是否可以重复使用一行,发现可行。
dp[j] = dp[j] + dp[j-1]

public class Solution {
    /**
     * @param n, m: positive integer (1 <= n ,m <= 100)
     * @return an integer
     */
    //法一:计算式m--;n--;求C(m+n,n) = (m+n)!/(m!n!)
    public int uniquePaths(int m, int n) {
        if(m == 1 || n == 1) return 1;
        m--; n--;
        long factorial = 1;
        for(int i = 1; i <= n; i++) {
            factorial = factorial*(m + i)/i;
        }
        return (int)factorial;
    }
    //法二:动态规划
    public int uniquePaths(int m, int n) {
        int dp[] = new int[n];
        for(int i = 0; i < n; i++) {
            dp[i] = 1;
        }
        for(int i = 1; i < m; i++) {
            for(int j = 1; j < n; j++) {
                dp[j] += dp[j-1];
            }
        }
        return dp[n-1];

    }
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:83923次
    • 积分:1836
    • 等级:
    • 排名:千里之外
    • 原创:103篇
    • 转载:4篇
    • 译文:0篇
    • 评论:3条
    最新评论