给定高度为n的一个整数三角形,找出从顶部到底部的最小路径和,只能向先移动相邻的结点。首先输入n,接下来的1~n行,第i行输入i个整数,输出分为2行,第一行为最小路径,第2行为最小路径和。用c语言写出来
时间: 2024-12-13 11:17:39 浏览: 4
这个问题可以使用动态规划(Dynamic Programming)中的“宽度优先搜索”(Bottom-Up approach with Dynamic Programming)或“回溯法”(Backtracking)来解决。这里我会给出一个基于宽度优先搜索的C语言解决方案:
```c
#include <stdio.h>
#include <stdlib.h>
#define ROWS 100 // 可调整以适应更大的三角形
int triangle[ROWS][ROWS];
// 动态规划函数,计算从给定点到底部的最小路径和
int minPathSum(int row, int col) {
if (row == 0 || col == 0 || col >= row)
return triangle[row][col];
else {
// 如果左边或上方的值存在,取较小值加上当前节点
int left = minPathSum(row - 1, col);
int up = minPathSum(row, col - 1);
return triangle[row][col] + (left < up ? left : up);
}
}
int main() {
int n;
printf("Enter the height of the triangle: ");
scanf("%d", &n);
for (int i = 0; i < n; i++) {
for (int j = 0; j <= i; j++) {
scanf("%d", &triangle[i][j]);
}
}
int startRow = 0, endCol = n - 1; // 初始位置
printf("Minimum path from top to bottom:\n");
for (int i = startRow; i <= endCol; i++) {
printf("%d ", minPathSum(n - 1, i));
}
printf("\n");
printf("Minimum path sum: %d\n", minPathSum(n - 1, endCol));
return 0;
}
```
这个程序首先读入三角形的每个元素,然后从左上角开始向下计算并存储最小路径和。最后,打印出最小路径和以及对应的最小路径。
阅读全文