给定一个m行n列的矩阵,从左上角开始每次只能向右或者向下移动,最后到达右下角的位置,路径上的所有数字累加起来作为这条路径的路径和。编写一个实验程序求所有路径和中的最小路径和。例如,以下矩阵中的路径1->3->1->0->6->1->0是所有路径中路径和最小的,返回结果是12: 1 3 5 9 8 1 3 4 5 0 6 1 8 8 4 0 输入 输入第一行为m,n的值,0<m,n<100。接下来是m行,每行n个整数,代表一个m行n列的矩阵。 输出c++详细思路
时间: 2024-02-25 13:51:44 浏览: 60
这是一个典型的动态规划问题。我们可以使用一个二维数组dp[m][n]来记录到每个位置的最小路径和。其中,dp[i][j]表示从左上角到(i,j)的最小路径和。那么,我们可以根据状态转移方程来计算出所有的dp[i][j]。
具体来说,对于第一行和第一列,它们只有一种到达方式,因此它们的dp值可以直接计算。对于其他位置,它们可以从左边或上边的位置转移而来,我们需要选择其中dp值最小的那个。
状态转移方程为:dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + matrix[i][j],其中matrix[i][j]表示矩阵中第i行第j列的数字。
最终,我们只需要返回dp[m-1][n-1]即可。
下面是这个问题的C++代码实现:
```c++
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int m, n;
cin >> m >> n;
vector<vector<int>> matrix(m, vector<int>(n));
vector<vector<int>> dp(m, vector<int>(n));
// 读入矩阵
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
cin >> matrix[i][j];
}
}
// 初始化第一行和第一列
dp[0][0] = matrix[0][0];
for (int i = 1; i < m; i++) {
dp[i][0] = dp[i-1][0] + matrix[i][0];
}
for (int j = 1; j < n; j++) {
dp[0][j] = dp[0][j-1] + matrix[0][j];
}
// 计算所有的dp值
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + matrix[i][j];
}
}
// 输出最终结果
cout << dp[m-1][n-1] << endl;
return 0;
}
```
希望这个回答能够帮助到你!
阅读全文