P1133 教主的花园(多维dp)

题目链接: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;
}
发布了438 篇原创文章 · 获赞 16 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_41829060/article/details/103812922