题目
题解思路
解法一
考虑到答案一定存在,而且从子层数也必定最大(最优解的子情况也最优 也就是说 n-1 到 n 的最大值选择的数 和 1到 n的最大值选择的数重合 )这样我们只需从最大层开始向上递增 每次对每个点的下一层中选择最优的 也就是
for(int i=r-1;i>=1;i--)
for(int j=1;j<=i;j++)
{
ta[i][j]=max(ta[i+1][j],ta[i+1][j+1])+ta[i][j];
}
这样下去最大值必定在ta[1][1]中取得
解法二
从上面往下面找答案 这样答案就是塔低中的最大值 最后再遍历塔底即可
for(int i=1;i<=i;i++)
for(int j=1;j<=i;j++)
{
ta[i][j]=max(ta[i-1][j],ta[i-1][j-1])+ta[i][j];
}
AC代码
#include <iostream>
#include <cstdio>
using namespace std;
int ta[1005][1005];
int t;
int main ()
{
cin>>t;
while(t--)
{
int r;
cin>>r;
for(int i=1;i<=r;i++)
for(int j=1;j<=i;j++)
cin>>ta[i][j];
for(int i=r-1;i>=1;i--)
for(int j=1;j<=i;j++)
{
ta[i][j]=max(ta[i+1][j],ta[i+1][j+1])+ta[i][j];
}
cout<<ta[1][1]<<endl;
}
return 0;
}