数塔问题

来源:互联网 发布:通快激光编程软件 编辑:程序博客网 时间:2024/06/15 15:03
/*Name: 数塔问题 Copyright: freeAuthor: 巧若拙 Date: 24-07-17 09:55Description: 数塔问题 :要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?1311 812 7 266 14 15 812 7 13 24 11算法思路:典型的动态规划,可以从上往下走,但是最终需要遍历最底层,找出最大值。更巧妙的方法是从右下角斜向上走,最终到达顶点,刚好得到答案。还可以利用上下层之间数值的关系,得到路径。 */#include<iostream>#include<cstdio>using namespace std;const int MAX = 100; int map[MAX][MAX];int DP(int n);void PrintPath(int n);int main() {int n;cin >> n;for (int i=0; i<n; i++){for (int j=0; j<=i; j++){cin >> map[i][j];}}cout << DP(n) << endl;PrintPath(n);    return 0;}int DP(int n) {for (int i=n-2; i>=0; i--) //从右下角斜向上走,最终到达顶点,刚好得到答案{for (int j=i; j>=0; j--) {map[i][j] += max(map[i+1][j], map[i+1][j+1]);}}return map[0][0];}void PrintPath(int n){int i = 0, j = 0;for (int k=1; k<n; k++) //输出前n-1行 {if (map[i+1][j] > map[i+1][j+1]) //向正下方走{cout << map[i][j] - map[i+1][j] << "->";i++;} else //向右下方走{cout << map[i][j] - map[i+1][j+1] << "->";i++;j++;} }//输出底层元素 cout << map[i][j] << endl;}

原创粉丝点击