数字三角形问题(数塔问题)
2017-10-27 19:48
253 查看
数字三角形问题(数塔问题)
Description下图给出了一个数字三角形,请编写一个程序,计算从顶至底的某处的一条路径,使该路径所经过的数字和最大
Input
有很多个测试案例,对于每一个测试案例, 通过键盘逐行输入,第1行是输入整数(如果该整数是0,就表示结束,不需要再处理),表示三角形行数n,然后是n行数
Output
输出最大值
Example Input
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
Example Output
30
代码块
#include<iostream> #include<cmath> #define MAX 1000 using namespace std; int data[MAX][MAX]; //储存原始数据 int dp[MAX][MAX]; //储存刷新后的数据 int tower_walk(int n) { //dp初始化 for(int i=0; i<n; i++) dp[n-1][i] = data[n-1][i]; int temp_max; //取最大值 for(int i=n-2; i>=0; i--) for(int j=0; j<=i; j++) { temp_max = max(dp[i+1][j],dp[i+1][j+1]); dp[i][j] = temp_max + data[i][j]; } } //打印和最大路径 int print(int n) { cout << "最大路径和:" << dp[0][0] << endl; int node_value; //首先输出塔顶元素 cout << "最大路径:" << data[0][0]; int j=0; for(int i=0; i<n; i++) { if(node_value == dp[i][j+1]) j++; cout << " -> " << data[i][j]; } cout << endl; } int main() { int n; //有n行 cin >> n; for(int i=0; i<n; i++) for(int j=0; j<=i; j++) cin >> data[i][j]; tower_walk(n); cout << dp[0][0] << endl; //最大值储存在dp[0][0]中 return 0; }