f[i]表示从上到下走到第i个位置时总和的最大值
那么这个最大值一定等于这个位置的值加上两条路径的最大值
这两条路径分别是从左上角过来和从右上角过来
但是需要特判,如果左上角没有元素或者右上角没有元素就不考虑这条路径
#include<bits/stdc++.h>
using namespace std;
const int N = 3e5 + 10;
int n, f[N], num[N], cnt, res;
void getf(int i, int j)
{
f[cnt] = -1e5;
if(i == 1) f[i] = num[i];
if(j > 1) f[cnt] = max(f[cnt], num[cnt] + f[cnt-i]);
if(j < i) f[cnt] = max(f[cnt], num[cnt] + f[cnt - i + 1]);
return;
}
int main()
{
cin >> n;
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= i; j ++)
cin >> num[++cnt], getf(i, j);
for(int i = (n-1)*n/2 + 1; i <= cnt; i ++) res = max(res, f[i]);
cout << res;
return 0;
}