zoukankan      html  css  js  c++  java
  • 洛谷1133 教主的花园

    洛谷1133 教主的花园

    本题地址: http://www.luogu.org/problem/show?pid=1133

    题目描述

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

    输入输出格式

    输入格式:

    输入文件garden.in的第1行为一个正整数n,表示需要种的树的棵树。
    接下来n行,每行3个不超过10000的正整数ai,bi,ci,按顺时针顺序表示了第i个位置种高度为10,20,30的树能获得的观赏价值。
    第i个位置的树与第i+1个位置的树相邻,特别地,第1个位置的树与第n个位置的树相邻。

    输出格式:

    输出文件garden.out仅包括一个正整数,为最大的观赏价值和。

    输入输出样例

    输入样例#1:

    4

    1 3 2

    3 1 2

    3 1 2

    3 1 2

    输出样例#1:

    11

    说明

    【样例说明】
    第1~n个位置分别种上高度为20,10,30,10的树,价值最高。

    【思路】

       环形DP。

       如果这个花园不是环而是直线的话:定义d[i][j]表示到第i棵树且目前第i棵树的状态为j的 最大价值。则有转移方程(见代码)。用到了别人的一个技巧可以定义j==2的时侯树高20且两边的树比他矮,定义j==3的时候树高20且两边的树比他高。这是自己没想到的。

       对于环形:枚举第一棵树的高度,DP。最后只考查符合枚举的d。

    【代码】

     1 #include<iostream>
     2 #include<cstring>
     3 using namespace std;
     4 
     5 const int maxn = 1000000+10;
     6 const int INF=1<<30;
     7 const int h[]={0,1,2,2,3};
     8 int d[maxn][5],w[maxn][4];
     9 int n;
    10 
    11 int main() {
    12     ios::sync_with_stdio(false);
    13     cin>>n;
    14     for(int i=1;i<=n;i++) cin>>w[i][1]>>w[i][2]>>w[i][3];
    15     
    16     int ans=-INF;
    17     for(int d1=1;d1<=4;d1++) {
    18         memset(d,0,sizeof(d));
    19         for(int i=1;i<=4;i++) d[1][i]=-INF;  //表示不可达 
    20         d[1][d1] = w[1][h[d1]];
    21         for(int i=2;i<=n;i++)
    22         {
    23                 d[i][1]=max(d[i-1][4],d[i-1][2])+w[i][1];
    24                 d[i][2]=d[i-1][1]+w[i][2];
    25                 d[i][3]=d[i-1][4]+w[i][2];
    26                 d[i][4]=max(d[i-1][1],d[i-1][3])+w[i][3];
    27         }
    28         switch (d1) {
    29              case 1: ans=max(ans,d[n][2]);ans=max(ans,d[n][4]); break;
    30              case 2: ans=max(ans,d[n][1]); break;
    31              case 3: ans=max(ans,d[n][4]); break;
    32              case 4: ans=max(ans,d[n][1]);ans=max(ans,d[n][3]); break;
    33         }
    34     }
    35     cout<<ans;
    36     return 0;
    37 }

       

  • 相关阅读:
    uva 11294 Wedding
    uvalive 4452 The Ministers’ Major Mess
    uvalive 3211 Now Or Later
    uvalive 3713 Astronauts
    uvalive 4288 Cat Vs. Dog
    uvalive 3276 The Great Wall Game
    uva 1411 Ants
    uva 11383 Golden Tiger Claw
    uva 11419 SAM I AM
    uvalive 3415 Guardian Of Decency
  • 原文地址:https://www.cnblogs.com/lidaxin/p/4889049.html
Copyright © 2011-2022 走看看