题意是啥

给你一个数列,可以任意删去一段,记其长度为$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

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

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

bzoj3255 一个关于序列的游戏的更多相关文章

  1. 【C语言探索之旅】 第一部分第八课:第一个C语言小游戏

    ​ 内容简介 1.课程大纲 2.第一部分第八课:第一个C语言小游戏 3.第一部分第九课预告: 函数 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写 ...

  2. 无聊的人用JS实现了一个简单的打地鼠游戏

    直入正题,用JS实现一个简单的打地鼠游戏 因为功能比较简单就直接裸奔JS了,先看看效果图,或者 在线玩玩 吧 如果点击颜色比较深的那个(俗称坏老鼠),将扣分50:如果点击颜色比较浅的那个(俗称好老鼠) ...

  3. 用原生javascript做的一个打地鼠的小游戏

    学习javascript也有一段时间了,一直以来分享的都是一些概念型的知识,今天有空做了一个打地鼠的小游戏,来跟大家分享一下,大家也可以下载来增加一些生活的乐趣,下面P出代码:首先是HTML部分代码: ...

  4. 一个html5 + nodejs的游戏

    可以阅读Mozilla开源的Browser Quest这个项目,一个html5 + nodejs的游戏,完整演示了客户端服务端怎么通讯的,逻辑怎么做的,通讯怎么做的,很值得参考. 游戏demo: ht ...

  5. 第29题:推断一个序列是否是还有一个push序列的pop序列

    github:https://github.com/frank-cq/MyTest 第29题:输入两个整数序列,当中一个序列表示栈的push顺序,推断还有一个序列有没有可能是相应的pop顺序.为了简单 ...

  6. Cocos2dx游戏开发系列笔记13:一个横版拳击游戏Demo完结篇

    懒骨头(http://blog.csdn.net/iamlazybone QQ:124774397 ) 写下这些东西的同时 旁边放了两部电影 周星驰的<还魂夜> 甄子丹的<特殊身份& ...

  7. python小练习:使用循环和函数实现一个摇骰子小游戏。游戏规则如下:游戏开始,首先玩家选择Big or Small(押大小),选择完成后开始摇三个骰子,计算总值,11<=总值<=18为“大”,3<=总值<=10为“小”。然后告诉玩家猜对或者是猜错的结果。

    python小练习:使用循环和函数实现一个摇骰子小游戏.游戏规则如下:游戏开始,首先玩家选择Big or Small(押大小),选择完成后开始摇三个骰子,计算总值,11<=总值<=18为“ ...

  8. pygame学习笔记(6)——一个超级简单的游戏

    转载请注明:@小五义  http://www.cnblogs.com/xiaowuyi 学了这么长时间的Pygame,一直想写个游戏实战一下.看起来很简单的游戏,写其来怎么这么难.最初想写个俄罗斯方块 ...

  9. 27.Next Permutation(下一个字典序列)

    Level:   Medium 题目描述: Implement next permutation, which rearranges numbers into the lexicographicall ...

随机推荐

  1. 插件使用一颜色选择器---cxColor

    cxColor 是一款颜色选择器.这样的插件使用场景不多.可喜的这是国人写的. 官方网站: https://github.com/ciaoca/cxColor 使用方法: 1.引入jquery库 1 ...

  2. Vuex详解笔记1

    vuex 是什么Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 什么是状态?状态这里泛指 ...

  3. [SDOI2018]荣誉称号

    题解: 并不需要什么算法 首先我们随便画一画就会发现 能画出一颗满二叉树 然后要满足每个点从上往下的路径和都相同(%m意义下) 一个点上可能对应了多个点 然后这样我们可以暴力dp $2^k*m^2+n ...

  4. 咸鱼入门到放弃1--JDBC

    JDBC参考微博https://www.cnblogs.com/surfcater/p/10224502.html 主要内容 1.JDBC相关概念 2.JDBC常用接口 driver connecti ...

  5. HDU3718 Similarity KM

    原文链接http://www.cnblogs.com/zhouzhendong/p/8284763.html 题目传送门 - HDU3718 题意概括 直接描述输入吧 首先一个T(T<15),表 ...

  6. xml方式将dataset导出excel

    using System;using System.Collections;using System.Collections.Generic;using System.Data;using Syste ...

  7. P1040 加分二叉树 区间dp

    题目描述 设一个nn个节点的二叉树tree的中序遍历为(1,2,3,…,n1,2,3,…,n),其中数字1,2,3,…,n1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第ii个节 ...

  8. themeleaf引入公共页面

    <div th:include="/top :: html"></div>//引用公共页面 <div th:replace="head&qu ...

  9. list set接口之间的区别

    list接口它的实现类,比如arraylist里面的值有序,并且可以重复.(有序指的是插入进去的顺序) set无序,且不可重复.(这里的无序就是指不是插入进去的顺序,但其实也不是真的无序,它会按照自己 ...

  10. ELM:ELM基于近红外光谱的汽油测试集辛烷值含量预测结果对比—Jason niu

    %ELM:ELM基于近红外光谱的汽油测试集辛烷值含量预测结果对比—Jason niu load spectra_data.mat temp = randperm(size(NIR,1)); P_tra ...