【u121】教主的花园
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】教主的花园的更多相关文章
- P1133 教主的花园
P1133 教主的花园 题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价值. 教 ...
- [luogu]P1133 教主的花园[DP]
[luogu]P1133 教主的花园 ——!x^n+y^n=z^n 题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会 ...
- 洛谷P1133 教主的花园
题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价值. 教主最喜欢3种树,这3种树 ...
- 教主的花园 dp
题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价值. 教主最喜欢333种树,这3 ...
- 洛谷 P 1133 教主的花园
题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价值. 教主最喜欢3种树,这3种树 ...
- P1133 教主的花园 (动态规划)
题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价值. 教主最喜欢 3种树,这3种 ...
- 洛谷—— P1133 教主的花园
https://www.luogu.org/problem/show?pid=1133 题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都 ...
- 题解——P1133 教主的花园DP
直接设二维状态具有后效性,会爆零 然后需要加一维 然后70 看了题解之后发现没有考虑1和n的关系 考虑之后,四十 然后懵逼 突然发现自己的ans更新写错了,导致每次ans都是第一个取30的情况的解 然 ...
- 洛谷 题解 P1133 【教主的花园】
$n<=10^5 $ O(n)算法 状态 dp[i][j][k]表示在第i个位置,种j*10的高度的树,且这棵树是否比相邻两棵树高 转移 dp[i][1][0]=max(dp[i-1][2][1 ...
随机推荐
- 【OC学习-8】存取器方法?getter和setter?事实上就是赋值和返回值的两种函数
我们在声明类的时候,有实例变量+方法(函数),这些实例变量假设默认的话都是protected类型,一般无法直接訪问.更别提赋值和调用了,所以就产生了两种函数,getter函数就是可以返回实例变量的值, ...
- iOS报错 -pie can only be used when targeting iOS 4.2 or later
近期,使用师兄的project时.突然报错之前没发现这个错误.信息例如以下: ld: -pie can only be used when targeting iOS 4.2 or later cla ...
- 缩放文本框ExpandTextView
效果图: 代码: import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import ...
- 比较s+=4;和s=s+4;的不同
1.s=s+4: public class Test { public static void main(String[] args){ short s=3; // s=s+4; //描述 资源 路径 ...
- 13.AxisUtil
1. package com.glodon.gspm.adapter.plugin.common; import lombok.SneakyThrows; import org.apache.axis ...
- Day4下午解题报告
预计分数:30+30+0=60 实际分数:30+30+10=70 稳有个毛线用,,又拿不出成绩来,, T1 https://www.luogu.org/problem/show?pid=T15626 ...
- vue中watch函数的用法
vue中watch函数: 不仅可以判断路由变化(上篇博客有介绍),还可以判断数据的变化 (1):首先写watch函数 (2):在data里定义值 (3):在methods里写方法 (4):使用值
- BZOJ1030: [JSOI2007]文本生成器(Trie图+dp)
Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是 ...
- SpringBoot进阶教程 | 第四篇:整合Mybatis实现多数据源
这篇文章主要介绍,通过Spring Boot整合Mybatis后如何实现在一个工程中实现多数据源.同时可实现读写分离. 准备工作 环境: windows jdk 8 maven 3.0 IDEA 创建 ...
- Java开源电商项目比較
这里比較的都是国外的开源项目,备选项目有: Smilehouse Workspace.Pulse.Shopizer.ofbiz.bigfish.broadleaf 1.Smilehouse Works ...