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 }

    如有错误,请指正。

  • 相关阅读:
    20170226-云计算设计模式翻译-自动伸缩指南(逐字翻译)
    20170723-Ioc与AOP
    20170710-几维晨规
    诸城项目-开发日志
    GPS常识-B版(简)
    GPS常识-A版(详)
    20141209-基本概念-BlogEngine.NET(1)-笔记
    9.聚类分析
    7.分类:基本概念 忌讳
    6.挖掘关联规则
  • 原文地址:https://www.cnblogs.com/_inx/p/7746220.html
Copyright © 2011-2022 走看看