题目链接:https://www.luogu.com.cn/problem/P1133
思路:
从题目中可知,有三种类型的状态
(1)1~n棵树
(2)每个位置上可能有3种不同的高度
(3)可能是高于两边,可能低于两边
所以分类讨论状态就可以了,但是要注意,我们不知道第一个位置是什么,所以可以假设第一个位置的高度,
枚举每种情况求出最大值就好了。
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int a[N][3] = {0},dp[N][3][2] = {0},n;
int main(void)
{
scanf("%d",&n);
for(int i=1; i<=n; i++)
for(int j=0; j<3; j++) scanf("%d",&a[i][j]);
int ans = 0;
for(int k=0; k<3; k++)
{
for(int i=0; i<3; i++) dp[1][i][0] = dp[1][i][1] = 0;
dp[1][k][0] = dp[1][k][1] = a[1][k];
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=0; i<k; i++) ans = max(ans,dp[n][i][0]);
for(int i=k+1; i<3; i++) ans = max(ans,dp[n][i][1]);
}
printf("%d\n",ans);
return 0;
}