#P6827. 「EZEC-4」括号

    ID: 5769 Type: RemoteJudge 1000~2200ms 128MiB Tried: 0 Accepted: 0 Difficulty: 6 Uploaded By: Tags>动态规划,dpO2优化状态压缩分块

「EZEC-4」括号

题目背景

离景似是昨日,转眼却已经年\newline 往事依旧,物是全非

题目描述

给一个由小括号组成的序列和 nn 个括号串,要你在序列中匹配允许不连续的子串。

母序列的每个括号最多被匹配一次。

一种可能的不连续子串匹配方式为 )()( 中匹配 ))(

每个括号串有一个值 vv,代表对这个串每匹配一个括号得到的价值。

每个括号串均可以多次匹配,可以随时停止匹配,但是不能在未匹配完一个括号串的情况下开始匹配其他括号串。

注意如果你跳过了母序列的某几个括号去匹配后面的,那么你将不能返回前面继续进行匹配。

求匹配能得到的最大值。

输入格式

第一行一个整数 nn,表示括号串的个数。

第二行一个字符串 kk,表示给出的母序列。

接下来 nn 行,每行一个括号串 aa 和一个数字 vv。在这 nn 行中,第 ii 行的字符 ai,via_i,v_i 表示一个存在的括号串以及匹配这个括号串内一个括号所能得到的价值。

输出格式

一个数 rr,表示能取得的最大值。

3 
((()())(()
(() 4
() 2
()()() 5
32
3
())()))()
()) 9
()() 8
())) 7
73

提示

【温馨提示】

为了卡掉错解开大了数据范围,请注意常数因子对程序产生的影响。

【数据范围】

本题使用捆绑测试。

对于 100%100\% 的数据, $1 \le n \le 500, 1 \le len(k) \le 10^4, 1 \le len(a) \le 300,0 \le v \le 10^3$。

Subtask n n \le len(k) len(k) \le len(a) len(a) \le 时间 分值 特殊性质
11 1010 77 1s1\text s 55 保证最优解每个 a 最多只用一次
22 5050 88 数据随机,若 AC subtask3 则不计入总分
33 10001000 1010 保证最优解每个 a 最多只用一次
44 100100 10410^4 1515
55 500500 1010
66 300300 2.2s2.2\text s 6060

【样例 11 解释】

最佳方案为先匹配 (() ,后匹配 ()()() ( 注意最多只能匹配到 ()() ),答案为 4×3+5×4=324\times3 + 5 \times 4 = 32

一种可行的匹配方法为方括号括起来的部分 (【(()()】)(【()】

而若先匹配 (() ,再匹配 () ,最后匹配 (() 的价值为 4×3+2×2+4×3=284\times 3 + 2\times 2 + 4\times 3 = 28,并非最佳方案。

注意我们不能先匹配 (() ,再匹配 ()()() 中一个括号,最后匹配 (() ,因为我们可以随时停止匹配,但不能在未匹配完某个串的情况下开始匹配另一个串。

【样例 22 解释】

最佳方案先匹配 ()),再匹配 ())) 最后匹配 ()) ( 注意最多只能匹配到 () ), 答案为 9×3+7×4+9×2=739\times 3 + 7 \times 4 + 9 \times 2 = 73