题目描述

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

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

输入输出格式

输入格式:

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

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

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

输出格式:

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

输入输出样例

输入样例#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 一定为偶数。

Solution

这道题的思路蛮好想的,只是稍微多了一些限制条件.

状态定义:
\[f[i][j][k]\]
表示当前 i 这个点, i-1 的选择为 j , 然后 i 的选择为 k.

状态转移
枚举当前这个的点的 j 和 k,然后判断 j 和 k 的大小关系.
如 : \[ f[i][j][k] \]其中 j>k
则有前驱状态:
\[f[i-1][1...j-1][j]\]
其他亦可依次类推.

但是需要注意最后一个节点和第一个节点的大小关系区分.
为此,我们可以直接枚举一重 head.
然后在里面循环的时候注意判断最后一个节点即可.

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn=100008;
int f[maxn][4][4];
int c[maxn][4],n;
int ans=-1,head;
int main()
{ios::sync_with_stdio(false);cin>>n;for(int i=1;i<=n;i++)for(int j=1;j<=3;j++)cin>>c[i][j];for(head=1;head<=3;head++){memset(f,0,sizeof(f));f[2][head][1]=c[1][head]+c[2][1];f[2][head][2]=c[1][head]+c[2][2];f[2][head][3]=c[1][head]+c[2][3];for(int i=3;i<=n;i++){for(int j=1;j<=3;j++)for(int k=1;k<=3;k++){if(j==k)continue;else{if(i==n){if(k==head)continue;if(j>k&&k>head)continue;if(j<k&&k<head)continue;              }if(j>k)for(int l=1;l<j;l++)f[i][j][k]=max(f[i][j][k],f[i-1][l][j]+c[i][k]);elsefor(int l=j+1;l<=3;l++)f[i][j][k]=max(f[i][j][k],f[i-1][l][j]+c[i][k]);}}   }for(int i=1;i<=3;i++)for(int j=1;j<=3;j++)ans=max(f[n][i][j],ans);}cout<<ans<<endl;return 0;
}

转载于:https://www.cnblogs.com/Kv-Stalin/p/9123197.html

P1133 教主的花园 (动态规划)相关推荐

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

    洛谷P1133 教主的花园 动态规划 这里是环状的,但是我们并不用将他破环成链 只要枚举第一个点 根据第一个点选择最后一个选择什么就行了 然后我们进行DP 注意如果当前是 2 的话要分情况 上一次是上 ...

  2. P1133 教主的花园

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

  3. 【题解】LuoGu1133:教主的花园

    原题传送门 显然的dp 设计状态dpi,j,kdp_{i,j,k}dpi,j,k​表示第iii棵树,种了高度为10j10j10j的树,高度关系是k(0/1)k(0/1)k(0/1),0表示比两边低,1 ...

  4. 动态规划--from zpz

    版权声明:copy from zpz,我可能要修改 https://blog.csdn.net/qq_40828060/article/details/83064425 文章目录 前言 记忆化搜索 动 ...

  5. 动态规划,且学且放弃

    文章目录 前言 记忆化搜索 动态规划的基本解题思路 背包问题 01背包 (待处理)P1489 猫狗大战 01背包的空间优化问题 P1048 采药 P1510 精卫填海 P1566 加等式 P1504 ...

  6. 【jzoj】2018.2.7NOIP普及组——某【BC】组模拟赛

    前言 --终于改完了,像之前小L一样崩溃.今天C组和B组一起做题,所以-- 正题 题目1:教主的花园(jzoj1792) 一平面直角坐标系,在x轴的位置建立一堵墙,墙上有n道门,给出门的位置,询问两个 ...

  7. 纪中国庆10.5做题小结

    纪中国庆10.5做题小结 T1:教主的花园 T2:教主泡嫦娥 T3:保镖排队 T4:教主的别墅 T1:教主的花园 Description [问题背景] LHX教主最近总困扰于前来膜拜他的人太多了,所以 ...

  8. jzojNOIP2014模拟 8.14总结

    教主的花园 (Standard IO) Time Limits: 1000 ms  Memory Limits: 65536KB Goto ProblemSet Description [问题背景] ...

  9. 1326. 灌溉花园的最少水龙头数目 动态规划

    1326. 灌溉花园的最少水龙头数目 在 x 轴上有一个一维的花园.花园长度为 n,从点 0 开始,到点 n 结束. 花园里总共有 n + 1 个水龙头,分别位于 [0, 1, ..., n] . 给 ...

最新文章

  1. 2.PyCharm安装和使用之HelloWorld
  2. 微服务的下一步,离不开服务网格
  3. SharePoint 2013创建应用程序时IIS端口文件夹下没文件
  4. Python+SQLite开发无界面版通信录管理系统
  5. 关于DButil的使用几点思考
  6. 零基础java自学流程-Java语言高级531
  7. Java基础之集合篇(内容超详细,带你轻松搞懂List、Set和Map的使用)
  8. 【软件测试】BUG的管理
  9. 企业云服务器的选择与配置指南
  10. 土巴兔CEO王国彬:这五点,决定了你事业的上限
  11. DataFrame增加数据的多种方法
  12. 解决SharedPerferences初始化报NullPoint空指针的异常
  13. 短信网关 php,php使用ICQ网关发送手机短信_PHP教程
  14. java jsp中的日历表_java-jsp日历
  15. 合泰单片机做电压表_合泰单片机使用总结
  16. 澳门赌王何鸿燊谈成功秘决
  17. 一个有关浮力的物理题
  18. 调用阿里云语音转文本
  19. python token_bytes_Python token.RSQB属性代码示例
  20. 拨号PPP NDIS RNDIS CDC ECM NCM QMI_WWAN GOBINET RMNET MBIM概念介绍

热门文章

  1. 【Qt开发】QTableWidget设置根据内容调整列宽和行高
  2. HDU 2586 How far away ?【LCA】
  3. 游三圣乡山中湖岛有感
  4. xflash里的hello world程序
  5. 终于用上gcc-4.1编译的系统了
  6. resource fork, Finder information, or similar detr
  7. wordpress配置SMTP服务发送邮件
  8. bootstrap .col-md-6 文字居中问题处理
  9. PHP函数库06:PHP统计字符串里单词出现次数
  10. HTML的xmlns的作用