问题描述
- Leetcode 62. 不同路径
- Leetcode 64. 最小路径和
解题报告
针对不同路径这道题:
状态定义:
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j] 表示从左上角到达坐标
(
i
,
j
)
(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]
初始状态:由于只能向下或向右移动,所以
d
p
[
i
]
[
0
]
=
1
dp[i][0]=1
dp[i][0]=1以及
d
p
[
0
]
[
i
]
=
1
dp[0][i]=1
dp[0][i]=1
针对最小路径和这道题:
状态定义:
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j] 表示从左上角到达坐标
(
i
,
j
)
(i,j)
(i,j) 的最小总和。
状态转移:
d
p
[
i
]
[
j
]
=
m
i
n
(
d
p
[
i
−
1
]
[
j
]
,
d
p
[
i
]
[
j
−
1
]
)
+
g
r
i
d
[
i
]
[
j
]
dp[i][j]=min(dp[i-1][j],dp[i][j-1])+grid[i][j]
dp[i][j]=min(dp[i−1][j],dp[i][j−1])+grid[i][j]
初始状态:由于只能向下或向右移动,所以
d
p
[
i
]
[
0
]
=
g
r
i
d
[
0
]
[
0
]
+
g
r
i
d
[
1
]
[
0
]
+
⋯
+
g
r
i
d
[
i
]
[
0
]
dp[i][0]=grid[0][0]+grid[1][0]+\cdots+grid[i][0]
dp[i][0]=grid[0][0]+grid[1][0]+⋯+grid[i][0]以及
d
p
[
0
]
[
i
]
=
g
r
i
d
[
0
]
[
0
]
+
g
r
i
d
[
0
]
[
1
]
+
⋯
+
g
r
i
d
[
0
]
[
i
]
dp[0][i]=grid[0][0]+grid[0][1]+\cdots+grid[0][i]
dp[0][i]=grid[0][0]+grid[0][1]+⋯+grid[0][i]
实现代码
- Leetcode 62. 不同路径
class Solution {
public:
int uniquePaths(int m, int n) {
vector<vector<int>>dp(n+1,vector<int>(m+1,0));
for(int i=1;i<=n;i++)
dp[i][1]=1;
for(int i=0;i<=m;i++)
dp[1][i]=1;
for(int i=2;i<=n;i++){
for(int j=2;j<=m;j++){
dp[i][j]=dp[i-1][j]+dp[i][j-1];
}
}
return dp[n][m];
}
};
- Leetcode 64. 最小路径和
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
int m=grid.size(),n=grid[0].size();
vector<vector<int>>dp(m+1,vector<int>(n+1,0));
// int dp[m+1][n+1];
for(int i=1;i<=m;i++)
dp[i][1]=dp[i-1][1]+grid[i-1][0];
for(int i=1;i<=n;i++)
dp[1][i]=dp[1][i-1]+grid[0][i-1];
//此处需要注意,因为前面初始化时已经做过dp[1][i]以及dp[i][1],所以此处从2开始循环
for(int i=2;i<=m;i++){
for(int j=2;j<=n;j++){
dp[i][j]=min(dp[i-1][j],dp[i][j-1])+grid[i-1][j-1];
}
}
return dp[m][n];
}
};