/*
Name: 数塔问题
Copyright: free
Author: 巧若拙
Date: 24-07-17 09:55
Description: 数塔问题 :
要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?
13
11 8
12 7 26
6 14 15 8
12 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;
}
数塔问题
最新推荐文章于 2024-03-29 20:43:11 发布