• 洛谷P1133 教主的花园


    题目描述

    教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价值。

    教主最喜欢3种树,这3种树的高度分别为10,20,30。教主希望这一圈树种得有层次感,所以任何一个位置的树要比它相邻的两棵树的高度都高或者都低,并且在此条件下,教主想要你设计出一套方案,使得观赏价值之和最高。

    输入输出格式

    输入格式:

    第一行为一个正整数n,表示需要种的树的棵树。

    接下来n行,每行3个不超过10000的正整数ai,bi,ci,按顺时针顺序表示了第ii个位置种高度为10,20,30的树能获得的观赏价值。

    i个位置的树与第i+1个位置的树相邻,特别地,第1个位置的树与第n个位置的树相邻。

    输出格式:

    一个正整数,为最大的观赏价值和。

    观察所有种树的状态,无非四种:

    1、当前种矮树,则前面可能种高的或者中的。

    2、当前为中树后面是矮树,则前面必须是矮树。

    3、当前为中树后面是高树,则前面必须是高树。

    4、当前是矮树,则前面可能是中树或者矮树。

    然后根据这些条件,列出转移方程。

    对于处理环,只需要枚举第一个位置种什么树就可以了。

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #define in(a) a=read()
    #define REP(i,k,n)  for(int i=k;i<=n;i++) 
    using namespace std;
    inline int read(){
        int x=0,f=1;
        char ch=getchar();
        for(;!isdigit(ch);ch=getchar())
            if(ch=='-')
                f=-1;
        for(;isdigit(ch);ch=getchar())
            x=x*10+ch-'0';
        return x*f;
    } 
    int n,ans; 
    int inp[100010][3];
    int dp[100010][4]; 
    int main(){ 
        in(n);
        REP(i,1,n)  in(inp[i][0]),in(inp[i][1]),in(inp[i][2]);
        REP(t,0,3){
            if(t==0)    dp[1][0]=inp[1][0],dp[1][1]=-999999999,dp[1][2]=-999999999,dp[1][3]=-999999999;
            if(t==1)    dp[1][1]=inp[1][1],dp[1][0]=-999999999,dp[1][2]=-999999999,dp[1][3]=-999999999;
            if(t==2)    dp[1][2]=inp[1][1],dp[1][0]=-999999999,dp[1][1]=-999999999,dp[1][3]=-999999999;
            if(t==3)    dp[1][3]=inp[1][2],dp[1][1]=-999999999,dp[1][2]=-999999999,dp[1][0]=-999999999;
            REP(i,2,n){
                dp[i][0]=max(dp[i-1][2],dp[i-1][3])+inp[i][0];
                dp[i][1]=dp[i-1][3]+inp[i][1];
                dp[i][2]=dp[i-1][0]+inp[i][1]; 
                dp[i][3]=max(dp[i-1][0],dp[i-1][1])+inp[i][2]; 
            }
            if(t==0)  ans=max(ans,max(dp[n][2],dp[n][3])); 
            if(t==1)  ans=max(ans,dp[n][3]);
            if(t==2)  ans=max(ans,dp[n][0]);
            if(t==3)  ans=max(ans,max(dp[n][0],dp[n][1])); 
             
        } 
        cout<<ans; 
        return 0;
    } 
  • 相关阅读:
    Software Update Services 2.0 概述
    Windows 2000组策略
    Windows 2000 默认安全策略设置
    C语言I博客作业06
    C语言I博客作业08
    C语言I博客作业09
    C语言I博客作业03
    C语言12019级秋季作业第一周作业
    C语言I博客作业02
    C语言I博客作业05
  • 原文地址:https://www.cnblogs.com/jason2003/p/10321382.html
Copyright © 2020-2023  润新知