有一个机器人的位于一个 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];
}
}

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

被折叠的 条评论
为什么被折叠?



