题目描述
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?
这是一个基于动态规划的问题,是一个利用矩阵int[][]作为dp矩阵的记忆化搜索算法,必须掌握
题目分析
题目中提出,只能向下或向右,就限制了机器人的行走状态,也从另一方面隐含的告知,某一位置(i,j)的行走依赖与之前位置(i,j-1)(从左边格子走来,对应于向右走)、(i-1,j)(从上边格子走来,对应于向下走)。 这就可以推出状态转移(记忆化搜索)方程:
dp[i][j]代表在从(0,0)->(i,j)位置有多少种可能,因为题目规定,只能向右或者向下,所以对于任意一个位置(i,j)来说,取决于其左边和上边(i,j-1)、(i-1,j),所以对于第一个格子(起点)来说,其只有一种可能,即1。
紧接着对于(0,1)来说,由于只能向右或者向下走,其只能从(0,0)走来,即
这样就可以推出我们的状态转移方程dp[i][j] = dp[i-1][j] (向下走) + dp[i][j-1] (向右走) 对于第一行和第一列的位置,由于只能向右边或者下边走,所以都为1,即
这样就可以求出整个dp矩阵,最终的答案就是dp[2][2] (即右下角的值)
代码
class Solution {
public int uniquePaths(int m, int n) {
int[][] dp = new int[m][n];
for (int i = 0; i <m ; i++) {
for (int j =0; j <n; j++) {
if(i == 0 && j == 0){
dp[i][j] = 1;
continue;
}
if(j!=0 && i != 0 ){
dp[i][j] = dp[i][j-1] + dp[i-1][j];
}else{
dp[i][j] = i == 0?dp[i][j-1]:dp[i-1][j];
}
}
}
return dp[m-1][n-1];
}
}