zoukankan      html  css  js  c++  java
  • [luogu]P1133 教主的花园[DP]

    [luogu]P1133

    教主的花园

    ——!x^n+y^n=z^n

    题目描述

    教主有着一个环形的花园,他想在花园周围均匀地种上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的树,价值最高。

    【数据规模与约定】

    对于20%的数据,有n≤10;

    对于40%的数据,有n≤100;

    对于60%的数据,有n≤1000;

    对于100%的数据,有4≤n≤100000,并保证n一定为偶数。


    动态规划,用f[i][x][y][k]表示第i个位置放x,上一个位置放y,第0个放k(用于最后判断n-1是否成立)

    转移:

    f[i][x][y][k]=Max{f[i-1][y][z][k]}((x<y&&y>z)||(x>y&&y<z))

    注意边界及最后特判。

    代码:

     1 //2017.10.28
     2 //DP
     3 #include<iostream>
     4 #include<cstdio>
     5 #include<cstring>
     6 using namespace std;
     7 inline int read();
     8 int Max(int x,int y){return x>y?x:y;}
     9 namespace lys{
    10     const int N = 1e5 + 7 ;
    11     int dp[N][3][3][3],v[N][3];
    12     int n,ans;
    13     int main(){
    14         int i,k,y,x,z;
    15         n=read();
    16         for(i=0;i<n;i++) v[i][0]=read(),v[i][1]=read(),v[i][2]=read();
    17         for(x=0;x<3;x++)
    18             for(y=0;y<3;y++) dp[0][x][y][x]=v[0][x];
    19         for(i=1;i<n;i++)
    20             for(x=0;x<3;x++)
    21                 for(y=0;y<3;y++)
    22                     for(z=0;z<3;z++)
    23                         for(k=0;k<3;k++)
    24                             if((x>y&&y<z)||(x<y&&y>z))
    25                                 dp[i][x][y][k]=Max(dp[i][x][y][k],dp[i-1][y][z][k]+v[i][x]);
    26         ans=0;
    27         for(i=0;i<3;i++)
    28             for(x=0;x<3;x++)
    29                 for(y=0;y<3;y++)
    30                     if((x<y&&x<i)||(x>y&&x>i)) ans=Max(ans,dp[n-1][x][y][i]);
    31         printf("%d
    ",ans);
    32         return 0;
    33     }
    34 }
    35 int main(){
    36     lys::main();
    37     return 0;
    38 }
    39 inline int read(){
    40     int kk=0,ff=1;
    41     char c=getchar();
    42     while(c<'0'||c>'9'){
    43         if(c=='-') ff=-1;
    44         c=getchar();
    45     }
    46     while(c>='0'&&c<='9') kk=kk*10+c-'0',c=getchar();
    47     return kk*ff;
    48 }

    如有错误,请指正。

  • 相关阅读:
    [kuangbin带你飞]专题十二 基础DP1 E
    hdu 1203 I NEED A OFFER! (01背包)
    hdu 2602 Bone Collector (01背包)
    hdu 4513 吉哥系列故事——完美队形II (manacher)
    hdu 2203 亲和串 (KMP)
    hdu 1686 Oulipo (KMP)
    hdu 1251 统计难题 (字典树)
    hdu 2846 Repository (字典树)
    hdu 1711 Number Sequence (KMP)
    poj 3461 Oulipo(KMP)
  • 原文地址:https://www.cnblogs.com/_inx/p/7746220.html
Copyright © 2011-2022 走看看