【u121】教主的花园
来源:互联网 发布:价值投资数据类app 编辑:程序博客网 时间:2024/05/02 06:11
Time Limit: 1 second
Memory Limit: 128 MB
【问题描述】
教主有着一个环形的花园,他想在花园周围均匀地种上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仅包括一个正整数,为最大的观赏价值和。
【数据规模】
对于20%的数据,有n≤10; 对于40%的数据,有n≤100; 对于60%的数据,有n≤1000; 对于100%的数据,有4≤n≤100000,并保证n一定为偶数。
Sample Input1
4
1 3 2
3 1 2
3 1 2
3 1 2
Sample Output1
11
【样例说明】
第1~n个位置分别种上高度为20,10,30,10的树,价值最高。
【题目链接】:http://noi.qz5z.com/viewtask.asp?id=u121
【题解】
第一个位置确定后,剩余的状态才能搞出来;
4种情况;
设f[n][4];
1 种高度为10的树
2 种高度为20的树,且两边为30
3 种高度为20的树,且两边为10
4 种高度为30的树
f[i][1] = max(f[i-1][3],f[i-1][4])+a[i][1];
f[i][2] = f[i-1][4]+a[i][2];
f[i][3] = f[i-1][1]+a[i][2];
f[i][4] = max(f[i-1][2],f[i-1][1])+a[i][3];
枚举第一个高度是什么(4种情况);
根据第一个状态可以确定第n个状态;获取答案就好;
【完整代码】
#include <cstdio>#include <cstdlib>#include <cmath>#include <set>#include <map>#include <iostream>#include <algorithm>#include <cstring>#include <queue>#include <vector>#include <stack>#include <string>using namespace std;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define LL long long#define rep1(i,a,b) for (int i = a;i <= b;i++)#define rep2(i,a,b) for (int i = a;i >= b;i--)#define mp make_pair#define pb push_back#define fi first#define se secondtypedef pair<int,int> pii;typedef pair<LL,LL> pll;void rel(LL &r){ r = 0; char t = getchar(); while (!isdigit(t) && t!='-') t = getchar(); LL sign = 1; if (t == '-')sign = -1; while (!isdigit(t)) t = getchar(); while (isdigit(t)) r = r * 10 + t - '0', t = getchar(); r = r*sign;}void rei(int &r){ r = 0; char t = getchar(); while (!isdigit(t)&&t!='-') t = getchar(); int sign = 1; if (t == '-')sign = -1; while (!isdigit(t)) t = getchar(); while (isdigit(t)) r = r * 10 + t - '0', t = getchar(); r = r*sign;}const int MAXN = 1e5+100;const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};const double pi = acos(-1.0);const int INF = 0x3f3f3f3f;int n;int a[MAXN][4];int f[MAXN][5];//1 种高度为10的树/* 2 种高度为20的树,且两边为30 3 种高度为20的树,且两边为10 4 种高度为30的树*/int main(){ //freopen("F:\\rush.txt","r",stdin); rei(n); rep1(i,1,n) rep1(j,1,3) rei(a[i][j]); //第一颗状态为1 int ans = 0; memset(f,-INF,sizeof(f)); f[1][1] = a[1][1]; rep1(i,2,n) { f[i][1] = max(f[i-1][3],f[i-1][4])+a[i][1]; f[i][2] = f[i-1][4]+a[i][2]; f[i][3] = f[i-1][1]+a[i][2]; f[i][4] = max(f[i-1][2],f[i-1][1])+a[i][3]; } ans = max(ans,max(f[n][3],f[n][4])); memset(f,-INF,sizeof(f));//第一颗状态为2 f[1][2] = a[1][2]; rep1(i,2,n) { f[i][1] = max(f[i-1][3],f[i-1][4])+a[i][1]; f[i][2] = f[i-1][4]+a[i][2]; f[i][3] = f[i-1][1]+a[i][2]; f[i][4] = max(f[i-1][2],f[i-1][1])+a[i][3]; } ans = max(ans,f[n][4]); memset(f,-INF,sizeof(f));//第一颗状态为3 f[1][3] = a[1][2]; rep1(i,2,n) { f[i][1] = max(f[i-1][3],f[i-1][4])+a[i][1]; f[i][2] = f[i-1][4]+a[i][2]; f[i][3] = f[i-1][1]+a[i][2]; f[i][4] = max(f[i-1][2],f[i-1][1])+a[i][3]; } ans = max(ans,f[n][1]); memset(f,-INF,sizeof(f));//第一颗状态为4 f[1][4] = a[1][3]; rep1(i,2,n) { f[i][1] = max(f[i-1][3],f[i-1][4])+a[i][1]; f[i][2] = f[i-1][4]+a[i][2]; f[i][3] = f[i-1][1]+a[i][2]; f[i][4] = max(f[i-1][2],f[i-1][1])+a[i][3]; } ans = max(ans,max(f[n][1],f[n][2])); printf("%d\n",ans); return 0;}
- 【u121】教主的花园
- 教主的花园
- 【枚举】教主的花园
- 教主的花园
- 【dp】教主的花园
- P1133 教主的花园
- 洛谷1133 教主的花园
- 洛谷 P1133 教主的花园
- 洛谷 P1133 教主的花园
- 洛谷 P1133 教主的花园
- 洛谷 P1133 教主的花园
- JZOJ 1406. 教主的花园
- 【二分】教主的花园解题报告
- 洛谷 P 1133 教主的花园
- 洛谷 P1133 教主的花园(多维DP)
- dp——洛谷P1133 教主的花园
- 你们的“教主”是谁?
- 3343: 教主的魔法
- 如何获得领导赏识
- Caffe: 安装Caffe的最快捷方法
- BUCK电路分析
- udacity assignment1
- Ubuntu GSL科学计算库安装配置
- 【u121】教主的花园
- 强化学习的一些基本知识
- @SpringBootApplication扫描哪些包
- 学习Jenkins遇到的那些坑
- C语言操作文件
- Cockroach Design 翻译 (一) 目录
- 【laravel】安装与配置(一)
- phpstorm使用总结(一)
- IPO与上市的关系?