题意是啥

给你一个数列,可以任意删去一段,记其长度为$s$,得到$val_s$的价值,问你最大价值和为多少..

其中这一段数要满足成一个上凸且相邻数差为$1$

显然,删掉一段数后剩下的左右会相邻..


%%%

伏地膜一发liaoliao.. 虽然他的代码被我拍出错了

记$f_{i,j}$为$[i,j]$这一段全部选的最优价值

$g_{i,j,k}$为$[i,j]$这一段存在一个长度为$k$的符合要求的子序列的最优价值

那么我们的任务就是把$f$和$g$交替维护

对于一个区间$[x,y]$

我们找到比$a_x$大$1$的那些数所在的位置,记为$p$

对于$x\leq p\leq y$

$g_{x,y,k}=f_{x+1,p-1}+g_{p,y,k-1}$

同样找到比$a_y$大$1$的那些数所在的位置,记为$p$

对于$x\leq p\leq y$

$g_{x,y,k}=f_{p+1,y-1}+g_{x,p,k-1}$

那么解决$f$的维护就是易如反(huan)掌了

$$f_{x,y}=max(max(g_{x,y,k}),max(f_{x,i}+f_{i+1,y})),\ k\in [1,y-x+1],\ i\in [x,y)$$

然后的话就是维护可以不选的情况了..

相信很简单..


Code

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <vector>
using namespace std;
const int Maxn = 160;
const int inf = 0x7fffffff;
int f[Maxn][Maxn][2], g[Maxn][Maxn][Maxn];
int val[Maxn], a[Maxn];
int b[Maxn], bl, ab[Maxn];
int n;
vector <int> vec[Maxn];
int _max(int x, int y) { return x > y ? x : y; }
int main() {int i, j, k;scanf("%d", &n);for(i = 1; i <= n; i++) scanf("%d", &val[i]);for(i = 1; i <= n; i++) scanf("%d", &a[i]), b[i] = a[i];sort(b+1, b+n+1);bl = unique(b+1, b+n+1) - (b+1);for(i = 1; i <= n; i++){ab[i] = lower_bound(b+1, b+bl+1, a[i]) - b;vec[ab[i]].push_back(i);}for(i = 0; i <= n+1; i++) for(j = 0; j <= n+1; j++){f[i][j][0] = f[i][j][1] = -inf;for(k = 0; k <= n; k++) g[i][j][k] = -inf;}f[1][0][0] = f[1][0][1] = 0;for(i = 1; i <= n; i++){f[i+1][i][1] = f[i+1][i][0] = 0;f[i][i][1] = val[1];f[i][i][0] = _max(0, val[1]);g[i][i][1] = 0;}for(k = 2; k <= n; k++){for(int x = 1; x <= n-k+1; x++){int y = x+k-1;for(int kk = 2; kk <= k; kk++){int sz;if(b[ab[x]]+1 == b[ab[x]+1]){sz = vec[ab[x]+1].size();for(i = 0; i < sz; i++){int p = vec[ab[x]+1][i];if(p < x || p > y) continue;if(g[p][y][kk-1] == -inf) continue;g[x][y][kk] = _max(g[x][y][kk], f[x+1][p-1][1]+g[p][y][kk-1]);}}if(b[ab[y]]+1 == b[ab[y]+1]){sz = vec[ab[y]+1].size();for(i = 0; i < sz; i++){int p = vec[ab[y]+1][i];if(p < x || p > y) continue;if(g[x][p][kk-1] == -inf) continue;g[x][y][kk] = _max(g[x][y][kk], f[p+1][y-1][1]+g[x][p][kk-1]);}}if(g[x][y][kk] != -inf) f[x][y][1] = _max(f[x][y][1], g[x][y][kk]+val[kk]);}for(i = x; i < y; i++){f[x][y][1] = _max(f[x][y][1], f[x][i][1]+f[i+1][y][1]);f[x][y][0] = _max(f[x][y][0], f[x][i][0]+f[i+1][y][0]);}f[x][y][0] = _max(f[x][y][0], f[x][y][1]);}}printf("%d\n", f[1][n][0]);return 0;
}

  


Tips

非常好人的贴出了liaoliao ac代码的wa数据

input:

11

-14 -53 68 43 0 0 0 0 0 0 0

3 5 6 8 7 7 4 0 6 1 5

output:

80


Review

感觉这样的题也是第一次见..

挺不错的一道题.. 这种处理方式也值得我去好好品味..

转载于:https://www.cnblogs.com/darklove/p/6511802.html

bzoj3255 一个关于序列的游戏相关推荐

  1. 用 Linux 命令玩一个有趣的数学游戏

    在家玩流行的英国游戏节目 "Countdown" 中的数字游戏. 像许多人一样,我在大流行期间看了不少新的电视节目.我最近发现了一个英国的游戏节目,叫做 Countdown,参赛者 ...

  2. (转)一个古老的编程游戏:Python Challenge全通攻略

    为什么80%的码农都做不了架构师?>>>    Python Challenge是一个网页闯关游戏,通过一些提示找出下一关的网页地址.与众不同的是,它是专门为程序员设计的,因为大多数 ...

  3. c语言min函数_C语言探索之旅 | 第一部分第十课:第一个C语言小游戏

    内容简介 前言 准备工作和建议 我的代码 改进方案 第一部分第十一课预告 1. 前言 上一课是 C语言探索之旅 | 第一部分第九课:循环语句 . 经过前面这么多课的努力,我们终于迎来了第一个比较正式的 ...

  4. 转:一个古老的编程游戏:Python Challenge全通攻略

    Python Challenge是一个网页闯关游戏,通过一些提示找出下一关的网页地址.与众不同的是,它是专门为程序员设计的,因为大多数关卡都要编程来算哦!! 去年和同学一起玩的,他做了大半,我做了小半 ...

  5. [转]一个古老的编程游戏:Python Challenge全通攻略

    Python Challenge是一个网页闯关游戏,通过一些提示找出下一关的网页地址.与众不同的是,它是专门为程序员设计的,因为大多数关卡都要编程来算哦!! 去年和同学一起玩的,他做了大半,我做了小半 ...

  6. c语言小游戏vc,C语言探索之旅:第一个C语言小游戏

    C语言探索之旅:第一个C语言小游戏-1.jpg (37.05 KB, 下载次数: 0) 2018-10-8 19:23 上传 内容简介 1.课程纲领 2.第一部分第八课:第一个C语言小游戏 3.第一部 ...

  7. 如何使用cocos2d-x 3.0来做一个简单的iphone游戏教程(第一部分)

    游戏截图: cocos2d-x 是一个支持多平台的开源框架,用于构建游戏.应用程序和其他图形界面交互应用.Cocos2d-x项目可以很容易地建立和运行在iOS,Android的三星Bada,黑莓Bla ...

  8. python编写赛车游戏单机版_使用Python中OrderedDict模拟一个简单的竞速游戏排名

    上一篇,我们梳理了Python中关于字典排序的一些常用方法(杂乱无章的数据结构如何进行排序,简明讲述Python字典排序那些事).其中,我们讲到了Python的collections模块中的Order ...

  9. 【Unity教程】创建一个完整的驾驶游戏

    专业游戏设计 你会学到什么 在unity HDRP创建一个完整的驾驶游戏 定制不同类型的汽车 将人工智能汽车和人工智能航路点系统添加到你的赛道上 添加汽车展厅菜单以解锁和购买新车 在Blender中设 ...

最新文章

  1. 数据库开发个人总结(ADO.NET小结)
  2. 让Windows Server 2008+IIS 7+ASP.NET突破默认限制,支持海量并发连接数
  3. 调制的缺点_电光调制与声光调制原理和应用领域
  4. webpack打包vue反编译_2020年你必须知道的webpack打包优化方法
  5. visual studio创建项目时需要注意的问题
  6. 2017蓝桥杯省赛---java---A---2(9数算式)
  7. 晚上美容护肤10要诀 - 健康程序员,至尚生活!
  8. 27.将 VMware 服务器上的虚拟机备份到 Azure(上)
  9. 11001-软件架构设计风格及visio使用
  10. PHP 中移除微信emoji表情
  11. 【量化投资】三大经典策略
  12. javaScript 对象大全 (javascript code al 2)(转转)
  13. 利用python统计excel中的数据
  14. 兽医靠养猪创业,带领60多家农户成功脱贫
  15. 让你的应用完美适配平板
  16. Android——一个简单的音乐APP(二)
  17. 学习ARM开发(3)
  18. Moviepy自动化视频处理:提取视频里的音乐(eg:MV音乐提取,抖音热门音乐提取)
  19. Redis源码——开篇
  20. android相机网格,网格相机app

热门文章

  1. 大学生学java要去培训机构吗?
  2. 是自学前端还是培训学前端?
  3. oracle11g设置数据库归档,oracle_Oracle11g RAC开启关闭、设置归档小结,关闭 1.先关数据库: 复制代 - phpStudy...
  4. python工作区是什么_在IPython中保存工作区
  5. java list e 查找_源码(04) -- java.util.ListE
  6. jq写的项目如何部署到静态服务器_如何在阿里云服务器上部署一个Web项目
  7. nginx一个端口配置多域名服务
  8. JSON和JS数据类型转化
  9. B树插入和删除的各种情况分析
  10. UnicodeDecodeError: 'gbk' codec can't decode byte 0xb4 in position xx