打卡!!!每日一题
今天给大家继续带来一道经典的动态规划题目
题目描述:62. 不同路径
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
题目示例:
对于动态规划类型的题目,我们只需先确定状态转移方程,然后在确定初始条件即可将问题迎刃而解
本题对于每一格的路径数量可以用dp[m][n]数组来表示,dp[i][j]则表示到第i行j列所对应路径数,每一个格子都可以从上边的格子和左边的格子移动而来,则状态转移方程:
d
p
[
i
]
[
j
]
=
d
p
[
i
−
1
]
[
j
]
+
d
p
[
i
]
[
j
−
1
]
dp[i][j]=dp[i-1][j]+dp[i][j-1]
dp[i][j]=dp[i−1][j]+dp[i][j−1]
接下来,我们继续确定初始条件,对于第一行的格子只能从左边移动而来,对于第一列的格子只能从上面的格子移动而来,所以dp[0][i]=1,dp[i][0]=1
完整代码如下:
public int uniquePaths(int m, int n) {
int[][] dp = new int[m][n];
//初始化
for (int i = 0; i < m; i++) {
dp[i][0] = 1;
}
for (int i = 0; i < n; i++) {
dp[0][i] = 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 - 1][n - 1];
}