原题
【问题描述】
观察下面的数字金字塔。写一个程序查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以从当前点走到左下方的点也可以到达右下方的点。
在上面的样例中,从 13 到 8 到 26 到 15 到 24 的路径产生了最大的和 86 。
【输入格式】
第一个行包含
R(1≤R≤1000) ,表示行的数目。
后面每行为这个数字金字塔特定行包含的整数。
所有的被供应的整数是非负的且不大于 100。
【输出格式】
输出仅一行为一个整数,表示最大的和。
思路
从倒数第2行开始,找下方数字的较大数加至原数,这时会不断向上,直到,此时我们找到了最大值,输出就行了
练手题不会有人不会吧。
AC
#include <bits/stdc++.h>
#pragma GCC optimize(1 , 2 , 3 , "Ofast" , "inline")
#define ll long long
using namespace std;
const int N = 5e5 + 5;
int r;
int a[1005][1005];
void solve()
{
cin>>r;
for(int i=1;i<=r;i++)
for(int j=1;j<=i;j++)
cin>>a[i][j];
for(int i=r-1;i>=1;i--)
for(int j=1;j<=i;j++)
a[i][j]+=max(a[i+1][j],a[i+1][j+1]);
cout<<a[1][1];
return ;
}
int main()
{
int T = 1;
// cin >> T;
while (T--)solve();
return 0;
}