题解——P1133 教主的花园DP

直接设二维状态具有后效性,会爆零

然后需要加一维

然后70

看了题解之后发现没有考虑1和n的关系

考虑之后,四十

然后懵逼

突然发现自己的ans更新写错了,导致每次ans都是第一个取30的情况的解

然后回到70

之后修改了一下初始化

初始化的时候也要注意排除自己假设之外的情况

100

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int n,dp[200200][4][2],a[200200][4],ans=0;
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=3;j++)
            scanf("%d",&a[i][j]);
    for(int fi=1;fi<=3;fi++){
        dp[1][1][0]=dp[1][2][0]=dp[1][3][0]=dp[1][1][1]=dp[1][2][1]=dp[1][3][1]=0;
        dp[1][fi][0]=dp[1][fi][1]=a[1][fi];
        for(int i=2;i<=n;i++){
            dp[i][1][0]=0;
            dp[i][1][1]=max(dp[i-1][2][0],dp[i-1][3][0])+a[i][1];
            dp[i][2][0]=dp[i-1][1][1]+a[i][2];
            dp[i][2][1]=dp[i-1][3][0]+a[i][2];
            dp[i][3][1]=0;
            dp[i][3][0]=max(dp[i-1][1][1],dp[i-1][2][1])+a[i][3];
        }
        if(fi==1){
            ans=max(ans,max(dp[n][2][0],dp[n][3][0]));
        }
        else if(fi==2){
            ans=max(ans,max(dp[n][1][1],dp[n][3][0]));
        }
        else{
            ans=max(ans,max(dp[n][1][1],dp[n][2][1]));
        }
    }
    printf("%d",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/dreagonm/p/9505483.html

时间: 2024-10-10 13:29:09

题解——P1133 教主的花园DP的相关文章

洛谷P1133 教主的花园 动态规划

洛谷P1133 教主的花园动态规划 这里是环状的,但是我们并不用将他破环成链 只要枚举第一个点 根据第一个点选择最后一个选择什么就行了 然后我们进行DP注意如果当前是 2 的话要分情况 上一次是上升 1 还是下降 0 F1[ i ] 表示 第 i 位置的种第 1 种树所能获得的最大价值 F2[ i ][ 0 ] 表示 第 i 位置的 种第 2 种树 且上次是下降 1 #include <bits/stdc++.h> 2 #define For(i,j,k) for(int i=j;i<=

P1133 教主的花园

P1133 教主的花园 题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价值. 教主最喜欢3种树,这3种树的高度分别为10,20,30.教主希望这一圈树种得有层次感,所以任何一个位置的树要比它相邻的两棵树的高度都高或者都低,并且在此条件下,教主想要你设计出一套方案,使得观赏价值之和最高. 输入输出格式 输入格式: 输入文件garden.in的第1行为一个正整数n,表示需要种的树的

洛谷P1133 教主的花园

题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价值. 教主最喜欢3种树,这3种树的高度分别为10,20,30.教主希望这一圈树种得有层次感,所以任何一个位置的树要比它相邻的两棵树的高度都高或者都低,并且在此条件下,教主想要你设计出一套方案,使得观赏价值之和最高. 输入输出格式 输入格式: 输入文件garden.in的第1行为一个正整数n,表示需要种的树的棵树. 接下来n行,每行

P1133 教主的花园 (动态规划)

题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价值. 教主最喜欢 3种树,这3种树的高度分别为 10,20,30.教主希望这一圈树种得有层次感,所以任何一个位置的树要比它相邻的两棵树的高度都高或者都低,并且在此条件下,教主想要你设计出一套方案,使得观赏价值之和最高. 输入输出格式 输入格式: 第一行为一个正整数 n ,表示需要种的树的棵树. 接下来 n 行,每行 3 个不超过

P1133教主的花园

本题是一道多维DP题目,那么在不打开算法标签的情况下怎么去想呢, 首先是题目的求的是最值,比较好想到的就是动态规划.首先是本题的种植范围限在一维,但是有种类要求,可以把高度10,20,30简单理解为种类1,2,3(因为没有其他奇奇怪怪的东西). 我们需要一维记录位置,二维记录种类,而教主大人又有特殊审美,所以要对树之间进行判断,三维记录前一个树的种类,而植树场地又是一个环,所以...再开一维特判1和n的种类,即记录第一课树的种类.所以...int f[100010][4][4][4],虽然是4维

洛谷教主花园dp

洛谷-教主的花园-动态规划 题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价值. 教主最喜欢3种树,这3种树的高度分别为10,20,30.教主希望这一圈树种得有层次感,所以任何一个位置的树要比它相邻的两棵树的高度都高或者都低,并且在此条件下,教主想要你设计出一套方案,使得观赏价值之和最高. 输入输出格式 输入格式: 输入文件garden.in的第1行为一个正整数n,表示需要种的

洛谷1133 教主的花园

洛谷1133 教主的花园 本题地址:http://www.luogu.org/problem/show?pid=1133 题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价值. 教主最喜欢3种树,这3种树的高度分别为10,20,30.教主希望这一圈树种得有层次感,所以任何一个位置的树要比它相邻的两棵树的高度都高或者都低,并且在此条件下,教主想要你设计出一套方案,使得观赏价值之和最

[二分][排序] JZOJ P1792 教主的花园

Description [问题背景] LHX教主最近总困扰于前来膜拜他的人太多了,所以他给他的花园加上了一道屏障. [问题描述] 可以把教主的花园附近区域抽像成一个正方形网格组成的网络,每个网格都对应了一个坐标(均为整数,有可能为负),若两个网格(x1, y1),(x2, y2)有|x1 – x2| + |y1 – y2| = 1,则说这两个网格是相邻的,否则不是相邻的. 教主在y = 0处整条直线上的网格设置了一道屏障,即所有坐标为(x, 0)的网格.当然,他还要解决他自己与内部人员的进出问题

教主的花园

题目描述 教主最近总困扰于前来膜拜他的人太多了,所以他给他的花园加上了一道屏障. 可以把教主的花园附近区域抽像成一个正方形网格组成的网络,每个网格都对应了一个坐标(均为整数,有可能为负),若两个网格(x1, y1),(x2, y2)有|x1 - x2| + |y1 - y2| = 1,则说这两个网格是相邻的,否则不是相邻的. 教主在y = 0处整条直线上的网格设置了一道屏障,即所有坐标为(x, 0)的网格.当然,他还要解决他自己与内部人员的进出问题,这样教主设置了N个入口a1, a2, …, a