LintCode UniquePaths 不同的路径

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

start1.21.31.41.51.61.7
2.1
3.13.23.33.43.53.6end

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

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

1111111

第二步:

1111111
1234567

第三步:

1111111
1234567
13610152128

如果是二维数组则
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];

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值