【一次过】【坐标型】Lintcode 114. 不同的路径

本文介绍了一个经典的算法问题:计算机器人从网格左上角到右下角的不同路径数量。通过动态规划的方法,详细解释了如何利用状态方程dp[i][j]=dp[i-1][j]+dp[i][j-1]解决此问题,并提供了两种实现代码,一种考虑了边界条件,另一种通过预先分配额外的空间简化了代码。

有一个机器人的位于一个 m × n 个网格左上角。

机器人每一时刻只能向下或者向右移动一步。机器人试图达到网格的右下角。

问有多少条不同的路径?

样例

给出 m = 3 和 n = 3, 返回 6.
给出 m = 4 和 n = 5, 返回 35.

注意事项

n和m均不超过100


解题思路:

Lintcode 110. 最小路径和的简单版本。

确定状态:

最后一步:无论机器人用何种方式到达右下角,最后一步挪动总是从左边或上边来。

子问题:设dp[i][j]为机器人有多少种方式从左上角走到[i][j]。

则状态方程:dp[i][j] = dp[i-1][j] + dp[i][j-1]

初始条件:

dp[0][0] = 1

边界条件:

i=0 或 j=0,则前一步只能由一个方向过来

public class Solution {
    /**
     * @param m: positive integer (1 <= m <= 100)
     * @param n: positive integer (1 <= n <= 100)
     * @return: An integer
     */
    public int uniquePaths(int m, int n) {
        // write your code here
        if(m==0 || n==0)
            return 0;
        
        int[][] dp = new int[m][n];
        
        //初始条件
        dp[0][0] = 1;
        
        //边界条件
        for(int i=1 ; i<dp.length ; i++)
            dp[i][0] = dp[i-1][0];
        
        for(int j=1 ; j<dp[0].length ; j++)
            dp[0][j] = dp[0][j-1];
        
        //状态方程
        for(int i=1 ; i<dp.length ; i++)
            for(int j=1 ; j<dp[0].length ; j++)
                dp[i][j] = dp[i-1][j] + dp[i][j-1];
        
        return dp[m-1][n-1];
    }
}

为防止边界条件过多,可以将数组多开辟一行一列作为左上角边界,这样状态方程就能直接从dp[1][1]开始讨论,而不必单独讨论边界条件,代码更简洁。

public class Solution {
    /**
     * @param m: positive integer (1 <= m <= 100)
     * @param n: positive integer (1 <= n <= 100)
     * @return: An integer
     */
    public int uniquePaths(int m, int n) {
        // write your code here
        if(m==0 || n==0)
            return 0;
        
        int[][] dp = new int[m+1][n+1];
        
        dp[0][1] = 1;
        
        for(int i=1; i<=m; i++)
            for(int j=1; j<=n; j++)
                dp[i][j] = dp[i-1][j] + dp[i][j-1];
        
        return dp[m][n];
    }
}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值