【动态规划】mr368-教主种树
【题目大意】
教主有着一个环形的花园,他想在花园周围均匀地种上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-教主种树的更多相关文章
- P1133 教主的花园 (动态规划)
题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价值. 教主最喜欢 3种树,这3种 ...
- BZOJ2151 种树(贪心+堆+链表/wqs二分+动态规划)
dp容易想到,但没法进一步优化了. 考虑贪心,每次选出价值最大的物品.但这显然是不对的因为会影响其他物品的选择. 于是考虑加上反悔操作.每次选出一个物品后,将其相邻两物品删除,再将原物品价值变为相邻两 ...
- 洛谷教主花园dp
洛谷-教主的花园-动态规划 题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价 ...
- [luogu]P1133 教主的花园[DP]
[luogu]P1133 教主的花园 ——!x^n+y^n=z^n 题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会 ...
- 楼天城楼教主的acm心路历程(作为励志用)
楼主个人博客:小杰博客 利用假期空暇之时,将这几年GCJ,ACM,TopCoder 參加的一些重要比赛作个 回顾.昨天是GCJ2006 的回顾,今天时间上更早一些吧,我如今还清晰记得3 年 前,我刚刚 ...
- [NOIP复习]第三章:动态规划
一.背包问题 最基础的一类动规问题.相似之处在于给n个物品或无穷多物品或不同种类的物品,每种物品仅仅有一个或若干个,给一个背包装入这些物品,要求在不超出背包容量的范围内,使得获得的价值或占用体积尽可能 ...
- 树形动态规划(树状DP)小结
树状动态规划定义 之所以这样命名树规,是因为树形DP的这一特殊性:没有环,dfs是不会重复,而且具有明显而又严格的层数关系.利用这一特性,我们可以很清晰地根据题目写出一个在树(型结构)上的记忆化搜索的 ...
- 洛谷P1133 教主的花园
题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价值. 教主最喜欢3种树,这3种树 ...
- 教主的花园 dp
题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价值. 教主最喜欢333种树,这3 ...
随机推荐
- document的属性与方法小结
document节点是文档的根节点,每张网页都有自己的document节点.属性:1:document.doctype----它是一个对象,包含了当前文档类型 (Document Type Decla ...
- 通过or注入py脚本
代码思路 1.主要还是参考了别人的代码,确实自己写的和别人写的出路很大,主要归咎还是自己代码能力待提高吧. 2.将功能集合成一个函数,然后通过*args这个小技巧去调用.函数的参数不是argv的值,但 ...
- 土司论坛nc反弹神器使用方法
说明: PS:我本机是linux,因为没有服务器所以使用win7来演示.倘若你是windows可以在本机生成dll以后再放到服务器上面去执行dll即可反弹shell物理机ip:192.168.1.12 ...
- x64dbg
https://x64dbg.com/ https://github.com/x64dbg/x64dbg https://sourceforge.net/projects/x64dbg/files/s ...
- Open Compute Project
Open Compute Project https://github.com/opencomputeproject https://github.com/floodlight/floodlight ...
- selenium遇到的一些问题,持续更新
1.今天早上运行程序的时候,发现我在循环点击一个元素的时候出现了错误 selenium.common.exceptions.StaleElementReferenceException: Messag ...
- C++ 模板的用法
C++中的高阶手法就会用到泛型编程,主要有函数模板, 在程序中使用模板的好处就是在定义时不需要指定具体的参数类型,而在使用时确可以匹配其它任意类型, 定义格式如下 template <class ...
- signal, sigaction,信号集合操作
信号是与一定的进程相联系的,而建立其信号和进程的对应关系,这就是信号的安装登记. Linux主要有两个函数实现信号的安装登记:signal和sigaction.其中signal在系统调用的基础上实现, ...
- MUI 页面刷新及页面传值问题
一.页面刷新问题 1.父页面A跳转到子页面B,B页面修改数据后再跳回A页面,刷新A页面数据 (1).父页面A代码 window.addEventListener("pageflowrefre ...
- php设计模式五----适配器模式
1.简介 适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁.这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能. 意图:将一个类的接口转换成客户希望的另外一个接口 ...