7.3Minimum Path Sum 基本动态规划:二维
题目描述
给定一个m*n大小的非负整数矩阵,求从左上角开始到右下角结束的、经过的数字的和最小的路径。每次只能向右或向下移动
输入输出样例
Input :
\[1, 3, 1\], \[1, 5, 1\], \[4, 2, 1\]
Output:7
也就是说1-3-1-1-1,一共是7
题解
这个也是要利用题目的逻辑转换成数组、进而转换成状态方程,然后用算法求解
先定义一个同样是二维的dp数组,dp[i][j]表示左上角开始到第(i, j)位置的最优路径的数字和。因为每次只能向下或向右移动,我们可以得到状态转移方程为dp[i][j] = min(do[i-1][j], dp[i][j-1] + grid[i][j])。grid为原数组
转换为算法的代码如下:
cpp
#include <iostream>
#include <vector>
using namespace std;
int minPathSum(vector<vector<int>>& grid) {
int m = grid.size(), n = grid[0].size();
vector<vector<int>> dp(m, vector<int>(n, 0));
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
if (i == 0 && j == 0) {
dp[i][j] = grid[i][j];
}
else if (i == 0) {
dp[i][j] = dp[i][j - 1] + grid[i][j];
}
else if (j == 0) {
dp[i][j] = dp[i - 1][j] + grid[i][j];
}
else {
dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
}
}
}
return dp[m - 1][n - 1];
}
int main() {
vector<vector<int>> grid = { {1,3,1},{1,5,1},{4,2,1} };
cout << minPathSum(grid) << endl;
return 0;
}