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 second typedef 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】教主的花园的更多相关文章

  1. P1133 教主的花园

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

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

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

  3. 洛谷P1133 教主的花园

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

  4. 教主的花园 dp

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

  5. 洛谷 P 1133 教主的花园

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

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

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

  7. 洛谷—— P1133 教主的花园

    https://www.luogu.org/problem/show?pid=1133 题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都 ...

  8. 题解——P1133 教主的花园DP

    直接设二维状态具有后效性,会爆零 然后需要加一维 然后70 看了题解之后发现没有考虑1和n的关系 考虑之后,四十 然后懵逼 突然发现自己的ans更新写错了,导致每次ans都是第一个取30的情况的解 然 ...

  9. 洛谷 题解 P1133 【教主的花园】

    $n<=10^5 $ O(n)算法 状态 dp[i][j][k]表示在第i个位置,种j*10的高度的树,且这棵树是否比相邻两棵树高 转移 dp[i][1][0]=max(dp[i-1][2][1 ...

随机推荐

  1. PatentTips - Control register access virtualization performance improvement

    BACKGROUND OF THE INVENTION A conventional virtual-machine monitor (VMM) typically runs on a compute ...

  2. cocos2d-x-lua基础系列教程六(lua-table增删改查)

    lua-table库 1.插入 table.insert () --假设没有设定位置.默认last位置 样例: myTable = { 1, 2, 3 } myTable.insert(myTable ...

  3. CSS3:元素的边框、背景和大小

    边框 和边框相关的属性例如以下. border-width 用于设置边框的宽度,可选择包含: 1)<长度值>:将边框宽度设为以CSS度量单位(如em.px.cm)表达的长度值. 2)< ...

  4. python实现获取文件列表中每一个文件keyword

    功能描写叙述: 获取某个路径下的全部文件,提取出每一个文件里出现频率最高的前300个字.保存在数据库其中. 前提.你须要配置好nltk #!/usr/bin/python #coding=utf-8 ...

  5. struts2中action手动获取參数

    struts2中action手动获取Session,jsp页面參数 1. ActionContext 在Struts2开发中,除了将请求參数自己主动设置到Action的字段中,我们往往也须要在Acti ...

  6. Android学习笔记进阶21之设置壁纸

    别忘记在ApplicationManifest.xml 中加上权限的设置. <uses-permission Android:name = "android.permission.SE ...

  7. [Vue + TS] Create Type-Safe Vue Directives in TypeScript

    Directives allow us to apply DOM manipulations as side effects. We’ll show you how you can create yo ...

  8. HTML基础第八讲---序列卷标

    转自:https://i.cnblogs.com/posts?categoryid=1121494 什么叫做序列卷标?其实,这是一个大家都蛮熟悉的东西,只是在网页中换个名称来称呼罢了,序列卷标的功能在 ...

  9. Java exception handling best practices--转载

    原文地址:http://howtodoinjava.com/2013/04/04/java-exception-handling-best-practices/ This post is anothe ...

  10. golang recover panic 流程控制的可达与不可达

    --------------------------流程控制可达----------------------------- package main import "fmt" fu ...