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. UVA 10306 e-Coins(全然背包: 二维限制条件)

    UVA 10306 e-Coins(全然背包: 二维限制条件) option=com_onlinejudge&Itemid=8&page=show_problem&proble ...

  2. Codeforces Round #316 (Div. 2) A B C

    A. Elections time limit per test 1 second memory limit per test 256 megabytes input standard input o ...

  3. Spring中JDBCTemplate的入门

    Spring是IOC和AOP的容器框架,一站式的框架 连接数据库的步骤:[必须会写] Spring当中如何配置连接数据库? 第一步配置核心配置文件: <?xml version="1. ...

  4. POJ 1320 Street Numbers Pell方程

    http://poj.org/problem?id=1320 题意很简单,有序列 1,2,3...(a-1),a,(a+1)...b  要使以a为分界的 前缀和 和 后缀和 相等 求a,b 因为序列很 ...

  5. 洛谷——P1073 最优贸易 ([NOIP2009] )

    https://www.luogu.org/problem/show?pid=1073 题目描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个 城市之间最多 ...

  6. Codeforces Round #277.5 解题报告

    又熬夜刷了cf,今天比正常多一题.比赛还没完但我知道F过不了了,一个半小时贡献给F还是没过--应该也没人Hack.写写解题报告吧= =. 解题报告例如以下: A题:选择排序直接搞,由于不要求最优交换次 ...

  7. Node.js笔记(九)Nodejs与shell

    众所周知.Nodejs是单进程异步执行的.但不光是单进程,Nodejs也提供了多进程方面的支持 其创始人应该还是比較重视这一块的,最有力的证据就是child_process是Nodejs核心模块之中的 ...

  8. tomcat的一些简单配置

    一.管理tomcatusernamepassword conf文件夹下,tomcat-users.xml <span style="font-size:24px;">& ...

  9. Android中实现整个视图切换的左右滑动效果

    Android中提供了一个Gallary,可以实现图片或者文本的左右滑动效果. 如何让整个视图都能实现左右滑动,达到类似于Gallary的效果呢?可以直接用一个开源的ViewFlow来实现.   项目 ...

  10. JS搜索菜单实现

    1 <!--菜单搜索功能--> 2 <!--先写静态页面--> 3 <!DOCTYPE html> 4 <html> 5 <head> 6 ...