题目描述

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

教主最喜欢 3种树,这3种树的高度分别为 10,20,30。教主希望这一圈树种得有层次感,所以任何一个位置的树要比它相邻的两棵树的高度都高或者都低,并且在此条件下,教主想要你设计出一套方案,使得观赏价值之和最高。

输入输出格式

输入格式:

第一行为一个正整数 n ,表示需要种的树的棵树。

接下来 n 行,每行 3 个不超过 10000的正整数 $$a_i,b_i,c_i$$ ,按顺时针顺序表示了第 i 个位置种高度为 10,20,30 的树能获得的观赏价值。

第 i个位置的树与第 i+1 个位置的树相邻,特别地,第 1 个位置的树与第 n 个位置的树相邻。

输出格式:

一个正整数,为最大的观赏价值和。

输入输出样例

输入样例#1:

4

1 3 2

3 1 2

3 1 2

3 1 2

输出样例#1:

11

说明

【样例说明】

第 1 至 n 个位置分别种上高度为 20,10,30,10 的树,价值最高。

【数据规模与约定】

对于 20%的数据,有 n≤10 ;

对于 40% 的数据,有 n≤100;

对于 60% 的数据,有 n≤1000 ;

对于 100% 的数据,有 4≤n≤100000 ,并保证 n 一定为偶数。

Solution

这道题的思路蛮好想的,只是稍微多了一些限制条件.




状态定义:

\[f[i][j][k]
\]

表示当前 i 这个点, i-1 的选择为 j , 然后 i 的选择为 k.




状态转移

枚举当前这个的点的 j 和 k,然后判断 j 和 k 的大小关系.

如 : $$ f[i][j][k] $$其中 j>k

则有前驱状态:

\[f[i-1][1...j-1][j]
\]

其他亦可依次类推.

但是需要注意最后一个节点和第一个节点的大小关系区分.

为此,我们可以直接枚举一重 head.

然后在里面循环的时候注意判断最后一个节点即可.



代码

#include<bits/stdc++.h>
using namespace std;
const int maxn=100008;
int f[maxn][4][4];
int c[maxn][4],n;
int ans=-1,head;
int main()
{
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=3;j++)
cin>>c[i][j];
for(head=1;head<=3;head++)
{
memset(f,0,sizeof(f));
f[2][head][1]=c[1][head]+c[2][1];
f[2][head][2]=c[1][head]+c[2][2];
f[2][head][3]=c[1][head]+c[2][3];
for(int i=3;i<=n;i++)
{
for(int j=1;j<=3;j++)
for(int k=1;k<=3;k++)
{
if(j==k)continue;
else
{
if(i==n)
{
if(k==head)continue;
if(j>k&&k>head)continue;
if(j<k&&k<head)continue;
}
if(j>k)
for(int l=1;l<j;l++)
f[i][j][k]=max(f[i][j][k],f[i-1][l][j]+c[i][k]);
else
for(int l=j+1;l<=3;l++)
f[i][j][k]=max(f[i][j][k],f[i-1][l][j]+c[i][k]);
}
}
}
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++)
ans=max(f[n][i][j],ans);
}
cout<<ans<<endl;
return 0;
}

P1133 教主的花园 (动态规划)的更多相关文章

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

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

  2. P1133 教主的花园

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

  3. 洛谷P1133 教主的花园

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

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

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

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

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

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

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

  7. 教主的花园 dp

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

  8. 洛谷 P 1133 教主的花园

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

  9. 【u121】教主的花园

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都 ...

随机推荐

  1. LR中下载文件的脚本

    #include "web_api.h" Action(){ int iflen; //文件大小 long lfbody; //响应数据内容大小 web_url("xxx ...

  2. LR中订单流程脚本

    Action(){ /* 主流程:登录->下订单->支付订单->获取订单列表 定义事物 1)登录 2)下订单 3)支付订单 4)获取订单列表 接口为:application/json ...

  3. SAP Cloud for Customer(C4C)的一些学习资料

    经常有顾问朋友们问我想自学C4C,有什么好的资料. SAP内部确实有一些C4C培训材料,但是不能散布到公司外部. 想学习C4C,还是得到SAP官网网站上查找资料. 1. 登录https://help. ...

  4. Codeforces Round #318 (Div. 2) A Bear and Elections (优先队列模拟,水题)

    优先队列模拟一下就好. #include<bits/stdc++.h> using namespace std; priority_queue<int>q; int main( ...

  5. SQL——SQL语言全部关键字详解

    http://blog.csdn.net/quinnnorris/article/details/71056445 数据库中我们做常用的就是SQL基本查询语言,甚至有些人认为数据库就是SQL,SQL就 ...

  6. 换个语言学一下 Golang (5)——运算符

    运算符用于在程序运行时执行数学或逻辑运算. Go 语言内置的运算符有: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 其他运算符 接下来让我们来详细看看各个运算符的介绍. 算术运算符 下表 ...

  7. 【Codeforces #228】Solutions

    http://codeforces.com/contest/389 重新把号刷到Div 1 准备ACM?(我这么菜还是玩玩算了……) 官方题解出的很快 Div2 A: 怎么做都行……随便找俩数减就可以 ...

  8. CSS - position属性小结

    Relative: 属于文档流,针对自身进行偏移: Absolute: 脱离文档流,针对最近的定位元素进行偏移,如果没有,则针对根元素,即body标签尽心偏移: Fixed: 和absolute基本一 ...

  9. 开源 java 电商系统

    shop++是基于spring.springmvc等主流框架开发,参考资料比较全面,上手容易: 比 javashop 代码可读性好. 适合二次开发 6.broadleaf基于spring.Spring ...

  10. java在线聊天项目0.9版 实现把服务端接收到的信息返回给每一个客户端窗口中显示功能之客户端接收

    客户端要不断接收服务端发来的信息 与服务端不断接收客户端发来信息相同,使用线程的方法,在线程中循环接收 客户端修改后代码如下: package com.swift; import java.awt.B ...