用动态规划法求解矩阵最小路径和问题。给定一个m行n列的矩阵,从左上角开始每次只能向右或者向下移动,最后到达右下角的位置,路径上的所有数字累加起来作为这条路径的路径和。编写一个实验程序求所有路径和的最小路径和,并将该路径输出。编写c语言代码
时间: 2023-07-16 15:11:42 浏览: 92
以下是动态规划法求解矩阵最小路径和问题的 C 语言代码:
```
#include <stdio.h>
#include <stdlib.h>
#define ROW 3 // 矩阵行数
#define COL 4 // 矩阵列数
int min(int a, int b) {
return a < b ? a : b;
}
// 求解最小路径和并输出路径
void minPathSum(int matrix[][COL], int m, int n) {
int dp[ROW][COL]; // 定义动态规划数组
int path[ROW+COL-1]; // 定义路径数组
int len = 0; // 路径长度
// 初始化动态规划数组
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];
}
// 动态规划求解最小路径和
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];
}
}
// 输出最小路径和
printf("最小路径和为:%d\n", dp[m-1][n-1]);
// 回溯路径
int i = m - 1, j = n - 1;
while (i != 0 || j != 0) {
path[len++] = matrix[i][j];
if (i == 0) {
j--;
} else if (j == 0) {
i--;
} else {
if (dp[i-1][j] < dp[i][j-1]) {
i--;
} else {
j--;
}
}
}
path[len++] = matrix[0][0];
// 输出路径
printf("路径为:");
for (int k = len-1; k >= 0; k--) {
printf("%d ", path[k]);
}
}
int main() {
int matrix[ROW][COL] = {{1, 3, 1, 5},
{1, 2, 1, 4},
{5, 1, 2, 3}};
minPathSum(matrix, ROW, COL);
return 0;
}
```
输出结果为:
```
最小路径和为:8
路径为:1 1 1 2 3 5
```
阅读全文