事实上,小X邀请两位奆老来的目的远不止是玩斗地主,主要是为了抓来苦力,替他的后花园种树……
小X的后花园是环形的,他想在花园周围均匀地种上n棵树,但是奆老花园的土壤当然非同寻常,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价值。
小X最喜欢3种树,这3种树的高度分别为10,20,30。小X希望这一圈树种得有层次感,所以任何一个位置的树要比它相邻的两棵树的高度都高或者都低,并且在此条件下,小X想要你设计出一套方案,使得观赏价值之和最高。

输入

第一行为一个正整数n,表示需要种的树的棵树。
接下来n行,每行3个不超过10000的正整数ai,bi,ci,按顺时针顺序表示了第i个位置种高度为10,20,30的树能获得的观赏价值。
注意:第i个位置的树与第i+1个位置的树相邻,特别地,第1个位置的树与第n个位置的树相邻。

输出

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

样例输入
样例数据 4
1 3 2
3 1 2
3 1 2
3 1 2

样例输出
11

提示
第1至n个位置分别种上高度为20,10,30,10的树,价值最高。
对于20%的数据,有n≤10
对于40%的数据,有n≤100
对于60%的数据,有n≤1000
对于100%的数据,有4≤n≤100000并保证n一定为偶数。

题意

  这是个环,这是个环,这是个环!!
  种树要求任何一个位置的树要比它相邻的两棵树的高度都高或者都低,让你在此要求下求出最大观赏价值。

思路

  才开始,上来没看到是环,就直接开了二维dp了,关键是样例还过了,果断就WA了。
  因为你最后要看第一棵树的情况,所以最少是开三维的数组,我比较菜,就开了四维dp[i][j][k][l],含义是第i个位置栽树j,他的前一棵树是k,第一棵树是l。

初始化的话:比较菜,就写的很直接
 dp[1][1][2][1] = dp[1][1][3][1] = a[1][1];    //a[1][1]是10m的价值dp[1][2][1][2] = dp[1][2][3][2] = a[1][2];    //a[1][2]是20m的价值dp[1][3][1][3] = dp[1][3][2][3] = a[1][3];    //a[1][3]是30m的价值
转移的话就是,三种情况:
  1. 第i位是树1(高10m),这时他的前一棵树只能是树2(高200m)或树3(高300m),如果是树2的话,那他的前前棵树只能是树1,否则他的前前棵树是树2或树3。
  2. 第i位是树2,这时他的前一棵树只能是树1或树3,如果是树1的话,那他的前前棵树是树1或树3,否则他的前前棵树是树2或树1。
  3. 第i位是树3,这时他的前一棵树只能是树1或树2,如果是树1的话,那他的前前棵树是树2或树3,否则他的前前棵树是树3。
 for(int i=2;i<=n;i++){for(int j=1;j<=3;j++){dp[i][1][2][j] = a[i][1]+dp[i-1][2][1][j];dp[i][1][3][j] = a[i][1]+max(dp[i-1][3][1][j],dp[i-1][3][2][j]);dp[i][2][1][j] = a[i][2]+max(dp[i-1][1][2][j],dp[i-1][1][3][j]);dp[i][2][3][j] = a[i][2]+max(dp[i-1][3][2][j],dp[i-1][3][1][j]);dp[i][3][1][j] = a[i][3]+max(dp[i-1][1][2][j],dp[i-1][1][3][j]);dp[i][3][2][j] = a[i][3]+dp[i-1][2][3][j];}}
最后找最大价值,三种情况:
  1. 最后一棵树是树1,他的前一棵树是树2,第一棵树是树2或者树3(或者前一棵树是树3,第一棵树是树2或者树3)
  2. 最后一棵树是树2,他的前一棵树是树1,第一棵树是树1(或者前一棵树是树3,第一棵树是树3)
  3. 最后一棵树是树3,他的前一棵树是树2,第一棵树是树1或者树2(或者前一棵树是树1,第一棵树是树1或者树2)
 int ans1 = max(dp[n][1][2][2],dp[n][1][2][3]);ans1 = max(ans1,max(dp[n][1][3][3],dp[n][1][3][2]));int ans2 = max(dp[n][2][1][1],dp[n][2][3][3]);int ans3 = max(dp[n][3][1][2],dp[n][3][1][1]);ans3 = max(ans3,max(dp[n][3][2][1],dp[n][3][2][2]));printf("%d",max(ans1,max(ans2,ans3)));

AC代码:

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#include<ctime>
#define ll long long
#define ld long double
#define ull unsigned long long
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 100100;
int a[maxn][4];
int dp[maxn][4][4][4];
int main(void)
{int n;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d%d%d",&a[i][1],&a[i][2],&a[i][3]);}dp[1][1][2][1] = dp[1][1][3][1] = a[1][1];dp[1][2][1][2] = dp[1][2][3][2] = a[1][2];dp[1][3][1][3] = dp[1][3][2][3] = a[1][3];for(int i=2;i<=n;i++){for(int j=1;j<=3;j++){dp[i][1][2][j] = a[i][1]+dp[i-1][2][1][j];dp[i][1][3][j] = a[i][1]+max(dp[i-1][3][1][j],dp[i-1][3][2][j]);dp[i][2][1][j] = a[i][2]+max(dp[i-1][1][2][j],dp[i-1][1][3][j]);dp[i][2][3][j] = a[i][2]+max(dp[i-1][3][2][j],dp[i-1][3][1][j]);dp[i][3][1][j] = a[i][3]+max(dp[i-1][1][2][j],dp[i-1][1][3][j]);dp[i][3][2][j] = a[i][3]+dp[i-1][2][3][j];}}int ans1 = max(dp[n][1][2][2],dp[n][1][2][3]);ans1 = max(ans1,max(dp[n][1][3][3],dp[n][1][3][2]));int ans2 = max(dp[n][2][1][1],dp[n][2][3][3]);int ans3 = max(dp[n][3][1][2],dp[n][3][1][1]);ans3 = max(ans3,max(dp[n][3][2][1],dp[n][3][2][2]));printf("%d",max(ans1,max(ans2,ans3)));return 0;
}

PS:看来还是题做的少啊,WA 7发……

石油大 2019秋个人训练赛1 B 种树相关推荐

  1. 石油大 2019年第二阶段我要变强个人训练赛第十八场 Problem N 扶桑号战列舰(线段树+区间更新+区间查询)

    链接:http://icpc.upc.edu.cn/problem.php?cid=1803&pid=13 题意:给出一个n,接下来一行给出n个数.才开始所有数为0,每次操作可以选一个区间[l ...

  2. 2019年CCSU训练赛一(A到L题解)

    因为一些原因题解迟到了,以后我争取当天或次日就搞定 A - A CodeForces - 1027D 读完发现这题跟牛客练习赛41C题差不多啊,于是想了一下并查集但没什么思路 考虑到存在u->v ...

  3. 大数据算法_看过来!2019“神气”大数据算法与应用赛决赛在即

    前方注意! 第二届智慧气象服务创新大赛 2019"神气"大数据算法与应用赛 决赛就要开始啦~ 快来看看都有哪些队伍来参赛吧! 第二届智慧气象服务创新大赛--2019"神气 ...

  4. 林大5.1训练赛补题

    林大5.1训练赛补题 A.凸多边形曼哈顿 E.矩阵快速幂 I.线段dp A.凸多边形曼哈顿 题意:给你一个凸多边形,问你当其中K边形的最大dis[]是多少? 思路:首先是要发现K>=4的时候答案 ...

  5. 【2019杭电多校训练赛】HDU6681 / 1002-Rikka with Cake 题解(扫描线)

    [2019杭电多校训练赛]HDU6681 / 1002-Rikka with Cake 题解 题意 思路 代码 题目来自于:HDU6681 Rikka with Cake 题意 题目的大意是给定你一个 ...

  6. bistuacm 2019年第⑦场新生训练赛题解

    比赛链接:bistuacm 新生训练赛 第七场 难度:cf 900~1400 A 知识点:枚举 题意:寻找距离数组某个数最接近的a[i]<=k且b[i]=1的数. 解法:按题意模拟即可. #in ...

  7. 【计算机视觉算法岗面经】“吐血”整理:2019秋招资料

    相关链接:[计算机视觉算法岗面经]"吐血"整理:2019秋招面经 //2018/09/27 兵荒马乱.浩浩荡荡的秋招终于差不多要结束了. 秋招这段时间真是感慨很多,一时得意一时失意 ...

  8. 2019年Robomaster江苏省赛总结

    2019年RM江苏省赛总结 文章目录 2019年RM江苏省赛总结 一 场地 二 调试工具 无线键鼠+小显示屏 2.4G连接 有线键鼠+大显示屏 putty+Xming实现笔记本的图形界面显示 VNC+ ...

  9. 数据分析真题日刷 | 招商银行信用卡中心2019秋招IT笔试(数据挖掘方向第二批)

    进入「数据分析真题日刷」系列第10篇 ⬇️ 今日真题 招商银行信用卡中心2019秋招IT笔试(数据挖掘方向第二批) (来源:牛客网) 题型 客观题:单选30道 主观题:问答4道 完成时间 120分钟 ...

  10. 【计算机视觉算法岗面经】“吐血”整理:2019秋招面经

    相关链接:[计算机视觉算法岗面经]"吐血"整理:2019秋招资料 //2018/09/28 当初开始面试时就想着,以后我一定要写一篇面经,现在是来还愿的时候了. 首先,嗯,非常感谢 ...

最新文章

  1. iOS NSObject对象内存大小
  2. 【电磁场实验作业】有限差分法(FDM)求解静电场电位分布
  3. cocos2dx热更新tmx的一个坑
  4. 50. 第一个只出现一次的字符
  5. opengl光线追踪的程序_【PathTracing】实时光线追踪和BSSRDF的那些事
  6. PHP通过身份证号码获取性别、出生日期、年龄等信息
  7. JSON字符串中带有反斜杠
  8. selenium+java打开新标签页方法
  9. “修真院”修行九九八十一难(1)
  10. mean-shift均值偏移算法
  11. 85 R 银行信用卡风控评分数据分析
  12. Facebook如何安全度过新账号阶段不被封号
  13. 简析金融IT行业发展前景
  14. java为什么要用反射_Java中为什么需要反射?反射要解决什么问题?
  15. 冯杰的手写艺术签名怎么写好看
  16. 信号发生器的设计(期末课程设计)
  17. 表达谱(DGE)测序与转录组测序的差别
  18. 微信公众号内置地图开发ios苹果不显示地图
  19. 记录gpu服务器上运行yolov5出现的问题
  20. 遗传分化一些基本概念

热门文章

  1. 开源代码分享(2)—综合能源系统零碳优化调度(附matlab代码)
  2. Kubernetes添加带Quota限额的CephFS StorageClass
  3. 使用transform使定位元素居中
  4. 计算机应用基础商娟叶,基于线上+线下混合式教学模式培养应用型技能人才
  5. 占全国三成的威海海参秋季开捕:实现丰收4.5万吨 价格涨一成
  6. python函数方法练习
  7. 鬼扯LENOVO-IBM
  8. 纳恩博获1亿美金C轮融资 发力机器人和智能短交通领域
  9. 电脑莫名弹出一些广告,并且相关软件已经被卸载
  10. 论文翻译——基于数据的最优直方图