【题目大意】

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

【输入格式】

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

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

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

【输出格式】

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

【样例输入】

4

1 3 2

3 1 2

3 1 2

3 1 2

【样例输出】

11

【样例说明】

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

【数据规模】

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

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

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

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

【思路】

f[i][0..3]分别表示前i棵树的最大观赏价值总和。

f[i][0]当前树高度为10,且前后的树高度均大于它(这是必然的);

f[i][1]当前树高度为20,且前后的树高度均大于它;

f[i][2]当前树高度为20,且前后的树高度均小于它;

f[i][3]当前树高度为30,且前后树的高度均小于它(这也是必然的)。

接下来以上述四种情况为第一棵树进行四次dp,每一次的f[i]=max(f[n-1][上述情况对应的前一棵树的情况]),绕各树一圈直到返回起始点,如f[i][0]对应的前一棵树就是f[i-1][2]和f[i-1][3]。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
const int MAXN=+;
using namespace std;
int f[MAXN][];
/*f[i][0..3]·Ö±ð±íʾǰi¿ÃÊ÷µÄ×î´ó¹ÛÉͼÛÖµ×ܺÍ
f[i][0]µ±Ç°Ê÷¸ß¶ÈΪ10£¬ÇÒǰºóµÄÊ÷¸ß¶È¾ù´óÓÚËü£¨ÕâÊDZØÈ»µÄ£©
f[i][1]µ±Ç°Ê÷¸ß¶ÈΪ20£¬ÇÒǰºóµÄÊ÷¸ß¶È¾ù´óÓÚËü
f[i][2]µ±Ç°Ê÷¸ß¶ÈΪ20£¬ÇÒǰºóµÄÊ÷¸ß¶È¾ùСÓÚËü
f[i][3]µ±Ç°Ê÷¸ß¶ÈΪ30£¬ÇÒǰºóÊ÷µÄ¸ß¶È¾ùСÓÚËü£¨ÕâÒ²ÊDZØÈ»µÄ£©*/
int a[MAXN][];
/*a[i][j]±íʾµÚi¸öλÖõÚjÖÖÊ÷µÄÉóÃÀ¼ÛÖµ*/
int n,ans; void init()
{
scanf("%d",&n);
for (int i=;i<n;i++)
for (int j=;j<;j++) scanf("%d",&a[i][j]);
} void dp(int x)
{
for (int i=;i<;i++) f[][i]=-0x7fffffff;
f[][x]=a[][(x+)/];
for (int i=;i<n;i++)
{
f[i][]=max(f[i-][],f[i-][])+a[i][];
f[i][]=f[i-][]+a[i][];
f[i][]=f[i-][]+a[i][];
f[i][]=max(f[i-][],f[i-][])+a[i][];
}
} void mainprocess()
{
ans=-;
dp();
ans=max(ans,max(f[n-][],f[n-][]));
dp();
ans=max(ans,f[n-][]);
dp();
ans=max(ans,f[n-][]);
dp();
ans=max(ans,max(f[n-][],f[n-][]));
cout<<ans<<endl;
} int main()
{
freopen("mr368.in0","r",stdin);
freopen("mr368.ou0","w",stdout);
init();
mainprocess();
return ;
}

【动态规划】mr368-教主种树的更多相关文章

  1. P1133 教主的花园 (动态规划)

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

  2. BZOJ2151 种树(贪心+堆+链表/wqs二分+动态规划)

    dp容易想到,但没法进一步优化了. 考虑贪心,每次选出价值最大的物品.但这显然是不对的因为会影响其他物品的选择. 于是考虑加上反悔操作.每次选出一个物品后,将其相邻两物品删除,再将原物品价值变为相邻两 ...

  3. 洛谷教主花园dp

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

  4. [luogu]P1133 教主的花园[DP]

    [luogu]P1133 教主的花园 ——!x^n+y^n=z^n 题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会 ...

  5. 楼天城楼教主的acm心路历程(作为励志用)

    楼主个人博客:小杰博客 利用假期空暇之时,将这几年GCJ,ACM,TopCoder 參加的一些重要比赛作个 回顾.昨天是GCJ2006 的回顾,今天时间上更早一些吧,我如今还清晰记得3 年 前,我刚刚 ...

  6. [NOIP复习]第三章:动态规划

    一.背包问题 最基础的一类动规问题.相似之处在于给n个物品或无穷多物品或不同种类的物品,每种物品仅仅有一个或若干个,给一个背包装入这些物品,要求在不超出背包容量的范围内,使得获得的价值或占用体积尽可能 ...

  7. 树形动态规划(树状DP)小结

    树状动态规划定义 之所以这样命名树规,是因为树形DP的这一特殊性:没有环,dfs是不会重复,而且具有明显而又严格的层数关系.利用这一特性,我们可以很清晰地根据题目写出一个在树(型结构)上的记忆化搜索的 ...

  8. 洛谷P1133 教主的花园

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

  9. 教主的花园 dp

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

随机推荐

  1. js_页面关闭beforeunload事件

    做圆桌爆文公众号的时候,需要对阅读的文章进行时间统计.是这个公众号的核心功能,客户把文章转发到朋友圈或者转给朋友,记录谁阅读此文章和阅读时长进行记录,从而展示给客户. 功能点是,关闭页面时触发事件,请 ...

  2. Python 模块搜索路径 -- (转)

    最近在看<Python源码剖析>,对Python内部运行机制比以前了解的更深入了,感觉自己有机会也可以做个小型的动态脚本语言了,呵呵,当然是吹牛了.目的当然不是创造一个动态语言,目的只有一 ...

  3. Spark-2.3.2【SparkStreaming+SparkSQL-实时仪表盘应用】

    应用场景:实时仪表盘(即大屏),每个集团下有多个mall,每个mall下包含多家shop,需实时计算集团下各mall及其shop的实时销售分析(区域.业态.店铺TOP.总销售额等指标)并提供可视化展现 ...

  4. 2017-2018-1 20179205《Linux内核原理与设计》第八周作业

    <Linux内核原理与设计>第八周作业 视频学习及操作分析 预处理.编译.链接和目标文件的格式 可执行程序是怎么来的? 以C语言为例,经过编译器预处理.编译成汇编代码.汇编器编译成目标代码 ...

  5. perl6中的q/qq/qx/qqx

    q不内插 qq内插 qx不内插 qqx内插

  6. 去掉每行的特定字符py脚本

    百度下载一个脚本的时候遇到那么一个情况.每行的开头多了一个空格.https://www.0dayhack.com/post-104.html 一个个删就不要说了,很烦.于是就有了下面这个脚本. #! ...

  7. Python【模块】importlib,requests

    内容概要:      模仿django中间件的加载方式      importlib模块      requests模块  rsplit()   用实际使用的理解来解释两个模块 importlib模块 ...

  8. Linux 入门记录:十五、Linux 网络基本配置

    一.以太网(Ethernet) 以太网(Ethernet)是一种计算机局域网技术.IEEE 组织的 IEEE 802.3 标准制定了以太网的技术标准,它规定了包括物理层的连线.电子信号和介质访问层协议 ...

  9. linux===linux后台运行和关闭、查看后台任务(转)

    fg.bg.jobs.&.ctrl + z都是跟系统任务有关的,虽然现在基本上不怎么需要用到这些命令,但学会了也是很实用的 一.& 最经常被用到这个用在一个命令的最后,可以把这个命令放 ...

  10. [转载]Python: 你不知道的 super

    原文出处: geekvi super() 的入门使用 在类的继承中,如果重定义某个方法,该方法会覆盖父类的同名方法,但有时,我们希望能同时实现父类的功能,这时,我们就需要调用父类的方法了,可通过使用  ...