题目描述 https://www.luogu.org/problem/P1133
首尾相连 需要特殊判断
dp[i][j[k]表示第i个树选第j种(0,1,2)左右比它高低(1,0)的最大价值
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=1e5+5;
int n,ans,a[N][5],dp[N][5][5];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d%d%d",&a[i][0],&a[i][1],&a[i][2]);
for(int j=0;j<=2;j++)
{
for(int i=0;i<=2;i++)
for(int k=0;k<=1;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][0][0],dp[i-1][1][0])+a[i][2];
}
for(int i=j+1;i<=2;i++) ans=max(ans,dp[n][i][1]);
for(int i=0;i<j;i++) ans=max(ans,dp[n][i][0]);
}
printf("%d",ans);
return 0;
}