1、题目描述
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
2、算法分析
题目说的是,给定m行n列的网格,有一个机器人从左上角(0,0)出发,每一步可以向下,也可以向右。问有多少种不同的方式。
dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。
最后一步:
无论机器人用何种方式到右下角,总有最后挪动的一步:向右或者想下。
右下角的坐标是(m-1,n-1),那么前一步机器人一定是在(m-1,n-1)或者(m-1,n-2)
那么机器人有X种方式从(m-2,n-1),有Y种方式从左上走到(m-1,n-2)则机器人有X+Y种方式走到(m-1,n-1)。则问题转化成,机器人有多少种方式从左上角走到(m-2,n-1)和(m-1,n-2)上。也就变成了子问题。
具体看代码:
3、代码实现
/**
* 1. 确定dp数组下表含义 dp[i][j] 到每一个坐标可能的路径种类
* 2. 递推公式 dp[i][j] = dp[i-1][j] dp[i][j-1]
* 3. 初始化 dp[i][0]=1 dp[0][i]=1 初始化横竖就可
* 4. 遍历顺序 一行一行遍历
*/
class Solution {
public int uniquePaths(int m, int n) {
// m行n列的网格
int[][] f = new int[m][n];
int i,j;
// 行,从上到下
for(i = 0;i < m;i++){
// 列,从左到右
for(j = 0;j < n;j++){
// 当i,j为0的时候,是1
// dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。
// 首先dp[i][0]一定都是1,因为从(0, 0)的位置到(i, 0)的路径只有一条,那么dp[0][j]也同理。
if(i ==0 || j ==0){
f[i][j] = 1;
}else{
f[i][j] = f[i-1][j] + f[i][j-1];
}
}
}
return f[m-1][n-1];
}
}