题目名称:数塔问题 题目描述: 图示是一个数字三角形,请编写一个程序计算从顶层到底层 的某处的一条路径,使该路径经过的数字总和最小,并输出总和。 注:(1)一步可沿左斜线向下或右斜线向下走; (2)三角形中的数字取值为 0,1,2…99.。 输入:n+1 行,第一行是一个整数 n,接来下是 n 行数字塔主体,数字 塔的第 k 行有 k 个数字。(1<=n<=100) 输出:一行,一个整数,即路径数字和的最小值。 样例输入: 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 样例输出: 17 C++递推全部代码
时间: 2024-04-17 08:27:36 浏览: 169
以下是用C++实现的数塔问题的递推解的完整代码:
```cpp
#includeiostream>
#include <vector>
#include <algorithm>
using namespace std;
int calculateMinPath(vector<vector<int>>& triangle) {
int n = triangle.size();
// 创建一个二维数组来保存最小路径和
vector<vector<int>> dp(n, vector<int>(n, 0));
// 将最底层的数字塔复制到 dp 数组中
for (int i = 0; i < n; i++) {
dp[n-1][i] = triangle[n-1][i];
}
// 从倒数第二层开始逐层向上计算最小路径和
for (int i = n-2; i >= 0; i--) {
for (int j = 0; j <= i; j++) {
// 取当前位置左下方和右下方的最小路径和,加上当前位置的值
dp[i][j] = triangle[i][j] + min(dp[i+1][j], dp[i+1][j+1]);
}
}
// 返回最小路径和
return dp[0][0];
}
int main() {
int n;
cin >> n;
// 创建一个二维数组来保存数字塔
vector<vector<int>> triangle(n, vector<int>(n, 0));
// 读取数字塔的值
for (int i = 0; i < n; i++) {
for (int j = 0; j <= i; j++) {
cin >> triangle[i][j];
}
}
// 计算最小路径和
int minPathSum = calculateMinPath(triangle);
// 输出结果
cout << minPathSum << endl;
return 0;
}
```
你可以将以上代码保存到一个名为 `tower.cpp` 的文件中,然后通过编译器编译运行该代码,输入样例输入数据后,将输出样例输出结果。
希望对你有帮助!
阅读全文