/**
* 62. 不同路径
* @author wsq
* @date 2020/10/13
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
问总共有多少条不同的路径?
示例:
输入: m = 3, n = 2
输出: 3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
1. 向右 -> 向右 -> 向下
2. 向右 -> 向下 -> 向右
3. 向下 -> 向右 -> 向右
链接:https://leetcode-cn.com/problems/unique-paths
*/
package com.wsq.dp;
public class UniquePaths {
/**
* 动态规划,由于机器人只能向下或者向右移动,因此:
* 1.确认最后一步: 一步到达f[m][n]有两种方式,从上方到达或者从左边到达
* 2.子问题: 到达左边方格有多少方式f[m][n-1],到达上边方格有多少种方式f[m-1][n]
* 3.确定转移方程 f[m][n] = f[m-1][n] + f[m][n-1]
* 4.初始条件: 状态矩阵中第一行和第一列到达的方式只能为1
* 5.边界情况
* 6.计算顺序: 逐行计算状态矩阵
* @param m
* @param n
* @return
*/
public int uniquePaths(int m, int n) {
// 确认最后一步
// f[i][j] = f[i-1][j] + f[i][j-1]
// 创建状态矩阵,由于需要f[i-1][j]的状态,因此肯定是二维的
int[][] f = new int[m][n];
for(int i = 0; i < m; i++){
for(int j = 0; j < n; 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];
}
}