第i个位置的树与第i+1个位置的树相邻,特别地,第1个位置的树与第n个位置的树相邻。
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
inline void re(int &x)
{
x=0;bool flag=false;
char c=getchar();
while(c<'0'||c>'9'){
flag= c=='-';
c=getchar();
}
while(c>='0'&&c<='9'){
x=(x<<1)+(x<<3)+(c^'0');
c=getchar();
}
if(flag)x=-x;
return ;
}
int dp[100010][3][2];//0:hi<left,hi<right;
int n;
int a[100010][3];
int main()
{
re(n);
for(int i=1;i<=n;i++)
{
re(a[i][0]);re(a[i][1]);re(a[i][2]);
}
int ans=0;
for(int j=0;j<3;j++)
{
for(int i=0;i<3;i++)
for(int k=0;k<2;k++)
dp[1][i][k]=0;
dp[1][j][0]=dp[1][j][1]=a[1][j];
for(int i=2;i<=n;i++)
{
dp[i][0][0]=max(dp[i-1][1][1],dp[i-1][2][1])+a[i][0];
dp[i][1][0]=dp[i-1][2][1]+a[i][1];
dp[i][1][1]=dp[i-1][0][0]+a[i][1];
dp[i][2][1]=max(dp[i-1][1][0],dp[i-1][0][0])+a[i][2];
}
for(int i=0;i<j;i++)
ans=max(ans,dp[n][i][0]);
for(int i=2;i>j;i--)
ans=max(ans,dp[n][i][1]);
}
printf("%d\n",ans);
return 0;
}