#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e3+5,M=1e6+5,inf=1e18;
int n,s;
int a[N][N];
struct code{
int u,x;
};
vector<code> op[M];
int dis[M];
bool vis[M];
int point(int x,int y){
return x*(x-1)/2+y;
}
void Spfa(){
for(int i=1;i<M;i++){
vis[i]=0;
dis[i]=0;
}
queue<int> q;
q.push(s);
vis[s]=1;
dis[s]=0;
while(!q.empty()){
int u=q.front();
q.pop();
vis[u]=0;
for(int i=0;i<op[u].size();i++){
code v=op[u][i];
if(dis[v.u]<dis[u]+v.x){
dis[v.u]=dis[u]+v.x;
if(vis[v.u]==0){
vis[v.u]=1;
q.push(v.u);
}
}
}
}
return ;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>n;
s=1;
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
cin>>a[i][j];
}
}
for(int i=1;i<n;i++){
for(int j=1;j<=i;j++){
int x=point(i,j);
op[x].push_back({point(i+1,j),a[i+1][j]});
if(j<i){
op[x].push_back({point(i+1,j+1),a[i+1][j+1]});
}
}
}
Spfa();
int ans=0;
for(int i=1;i<=n;i++){
ans=max(ans,dis[point(n,i)]);
}
cout<<ans+a[1][1];
return 0;
}