题目描述
设有一个三角形的数塔,顶点为根结点,每个结点有一个整数值。从顶点出发,可以向左走或向右走,如图所示
若要求从根结点开始,请找出一条路径,使路径之和最大,只要输出路径的和。
输入
第一行为n(n<10),表示数塔的层数
从第2行至n+1行,每行有若干个数据,表示数塔中的数值。
输出
输出路径和最大的路径值。
样例输入
5 13 11 8 12 7 26 6 14 15 8 12 7 13 24 11
样例输出
86
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
using namespace std;
const long long maxl=1005;
int Tower[maxl][maxl];//存储数塔原始数据
int dp[maxl][maxl]; //存储动态规划过程中的数据
int n;//塔的层数
void Tower_dp();
int main()
{
memset(Tower,0,sizeof(Tower));
memset(dp,0,sizeof(dp));
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
cin>>Tower[i][j];
}
}
Tower_dp();
cout<<dp[1][1]<<endl;
return 0;
}
void Tower_dp()
{
for(int i=1;i<=n;i++)//将塔底层的数据复制给dp(存储动态规划过程中的数据)
{
dp[n][i]=Tower[n][i];
}
for(int i=n-1;i>=0;i--)
{
for(int j=1;j<=i;j++)
{
// 使用递推公式计算dp的值
dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+Tower[i][j];
}
}
}