【ZJOI2017 Round1练习】D8T2 sequence(DP)
题意:


思路:


#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <map>
using namespace std; const int N = , INF = -0x3f3f3f3f;
int n, m, ans[N], v[N], a[N], last[N][N], f[N][N][N], g[N][N][N];
map<int, int> hash; inline void upt(int &x, const int &y) {
if (x < y) x = y;
} char ch;
inline int read() {
int res = , sgn = ;
while (ch = getchar(), ch < '' || ch > '') if (ch == '-') break;
ch == '-' ? sgn = : res = ch - ;
while (ch = getchar(), ch >= '' && ch <= '') res = res * + ch - ;
return sgn == ? res : -res;
} int main() {
freopen("sequence.in", "r", stdin);
freopen("sequence.out", "w", stdout); n = read();
for (int i = ; i <= n; ++i) v[i] = read();
for (int i = ; i <= n; ++i) {
a[i] = read();
if (hash[a[i]] == ) hash[a[i]] = ++m;
}
for (int i = ; i <= n; ++i) {
for (int j = ; j <= m; ++j) last[i][j] = last[i - ][j];
last[i][hash[a[i]]] = i;
}
memset(f, INF, sizeof(f));
memset(g, INF, sizeof(g));
for (int i = ; i <= n; ++i) {
for (int j = ; j <= n; ++j)
if (i + j <= n)
f[i][i][j] = g[i][i][j] = v[j + ];
else break;
f[i][i - ][] = g[i][i - ][] = ;
}
for (int l = ; l <= n; ++l)
for (int i = ; i <= n; ++i) {
int j = i + l;
if (j > n) break;
for (int k = ; k <= n; ++k) {
if (j + k > n) break;
upt(f[i][j][k], f[i][j - ][] + v[k + ]);
upt(g[i][j][k], f[i][j - ][] + v[k + ]);
int p = hash[a[j] + ], q = hash[a[j] - ];
for (int h = last[j][p]; h >= i; h = last[h - ][p])
upt(f[i][j][k], f[i][h][k + ] + f[h + ][j - ][]);
for (int h = last[j][q]; h >= i; h = last[h - ][q]) {
upt(f[i][j][k], g[i][h][k + ] + f[h + ][j - ][]);
upt(g[i][j][k], g[i][h][k + ] + f[h + ][j - ][]);
}
}
}
ans[] = ;
for (int i = ; i <= n; ++i) {
upt(ans[i], ans[i - ]);
for (int j = ; j < i; ++j)
upt(ans[i], ans[j] + f[j + ][i][]);
}
printf("%d\n", ans[n]);
return ;
}
【ZJOI2017 Round1练习】D8T2 sequence(DP)的更多相关文章
- 【ZJOI2017 Round1练习&BZOJ4767】D1T3 两双手(排列组合,DP)
题意: 100%的数据:|Ax|,|Ay|,|Bx|,|By| <= 500, 0 <= n,Ex,Ey <= 500 思路:听说这是一道原题 只能往右或者下走一步且有禁止点的简化版 ...
- 【ZJOI2017 Round1练习】D4T2 trie(贪心,状压DP)
题意:现在 Matej 手上有 N 个英文小写字母组成的单词, 他想知道,如果将这 N 个单词中的字母分别进行重新排列,形成的字母树的节点数最少是多少. n<=16,len[i]<=100 ...
- 【ZJOI2017 Round1练习&BZOJ4774】D3T2 road(斯坦纳树,状压DP)
题意: 对于边带权的无向图 G = (V, E),请选择一些边, 使得1<=i<=d,i号节点和 n − i + 1 号节点可以通过选中的边连通, 最小化选中的所有边的权值和. d< ...
- 【ZJOI2017 Round1练习&BZOJ5354】D7T3 room(DP)
题意: 思路: 写了两种版本 考场版本 ..,..]of longint; t:..,..]of longint; n,m,i,j,k,oo,ans,d1:longint; function min( ...
- 【ZJOI2017 Round1练习&BZOJ5350】D5T1 masodik(DP,斜率优化)
题意:你要从(0,0)点走到(n,m), 每次只能往 x 轴或者 y 轴正方向移动一个单位距离.从(i,j)移动到(i,j+1)的代价为 ri,从(i,j)移动到(i+1,j)的代价为 cj. 求最小 ...
- 【ZJOI2017 Round1练习&UVA1057】D6T1 Routing(DP,SPFA)
题意:给你一个有向图, 并指定起点和终点. 问要从起点走向终点, 再从终点走向起点, 最少需要走过多少不同的节点. 对于 100%的数据, 有 N<=100, M<=min(1000,N* ...
- [poj3017] Cut the Sequence (DP + 单调队列优化 + 平衡树优化)
DP + 单调队列优化 + 平衡树 好题 Description Given an integer sequence { an } of length N, you are to cut the se ...
- Codeforces Round #277 (Div. 2) E. LIS of Sequence DP
E. LIS of Sequence Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/486/pr ...
- hdu6078 Wavel Sequence dp+二维树状数组
//#pragma comment(linker, "/STACK:102400000,102400000") /** 题目:hdu6078 Wavel Sequence 链接:h ...
随机推荐
- AJPFX总结面向对象特征之一的继承知识
继 承(面向对象特征之一) 好处: 1:提高了代码的复用性. 2:让类与类之间产生了关系,提供了另一个特征多态的前提. 父类的由来:其实是由多个类不断向上抽取共性内容而来的. java中对于继承, ...
- Swift 基础语法入门(一)
一.变量和常量 1.声明常量和变量 用let来声明常量 let radius = 10 用var来声明变量 var age = 20 或者是var x = 0.0, y = 0.0, z = 0 ...
- turn协议的工作原理
Allocate请求 客户端通过发送Allocate请求给STUN服务器,从而让STUN服务器为A用户开启一个relay端口. a) 客户端A向STUN Port发送Allocate请求(图中 ...
- DOM,javascript,Web API之间的关系——onclick 引起的思考与调研
平时习惯了用js操作dom树来与html页面进行交互,基本都是通过web API接口实现的,最近看闭包和原生js的知识点比较多,昨天无意中看到了onclick中的this指向问题,遂用native j ...
- css中display设置为table、table-row、table-cell后的作用及其注意点
html: <div class="table"> <div class="row"> <div class="cell ...
- 微信“摇一摇·周边”正式开放
今日,在微信公开课第三季长沙站现场,微信团队宣布“摇一摇·周边”(以下简称“摇周边”)正式对外开放.拥有微信认证的公众帐号商户,均可通过摇周边的商户申请平台(https://zb.weixin.qq. ...
- R58的编译步骤f1选项v1.1版本
R58的编译步骤f1选项v1.1版本 2017/3/16 16:38 请严重注意: 编译全志R58的Android6.0.1的系统和其它系统有两个不同: 1.在执行pack打包之前,必须执行verit ...
- Java语法基础-final关键字
final关键字主要用在三个地方:变量.方法.类. 对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改: 如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一 ...
- oracle 时区
select sysdate from dual;select systimestamp from dual;select localtimestamp from dual;select curren ...
- CREATE SCHEMA - 定义一个新的模式
SYNOPSIS CREATE SCHEMA schemaname [ AUTHORIZATION username ] [ schema_element [ ... ] ] CREATE SCHEM ...