毕竟是个渣,写完一遍之后又按LRJ的写了一遍,再写了一遍递归版,最终加上输出解部分

括号序列

定义如下规则序列(字符串):

空序列是规则序列;

如果S是规则序列,那么(S)和[S]也是规则序列;

如果A和B都是规则序列,那么AB也是规则序列。

例如,下面的字符串都是规则序列:

(), [], (()), ([]), ()[], ()[()]

这几个则不是规则序列:

(, [, ], )(, ([()

现在,给出一些由‘(’,‘)’,‘[’,‘]’构成的序列,请添加尽量少的括号,得到一个规则序列。

分析

  • 很容易想到的递归版本
uses
math;
var
s:string;
function answer(l,r:longint):longint;
var mini,k:longint;
begin
if l=r then exit(1)
else if (s[l]='(')and(s[r]=')')or(s[l]='[')and(s[r]=']') then exit(answer(l+1,r-1))
else if l<r then begin
mini:=maxint;
for k:=l to r-1 do
mini:=min(mini,answer(l,k)+answer(k+1,r));
exit(mini);
end else exit(0);
end;
begin
readln(s);
writeln(answer(1,length(s)));
end.
  • 稍微做下改动,同时为了方便输出解(输出时再判定一次)

d(s)表示s的解

现存在两种情况

当s形为(s')时,转移到d(s')

当length(s)>1 时,转移到d(sA)+d(sB)

边界条件

length(s)=1时 d(s)=1

其他为0

{2015-9-24 括号序列}
{program by Chuck}{误} program noip_dp_1;
uses
math;
const
maxn=1000;
type
LL=longint;
var
d:array[1..maxn,1..maxn] of LL;
i,j,k,n:LL;
st:ansistring;
boo:boolean;
function match(l,r:char):boolean;
begin
if (l='(') and (r=')') or (l='[') and (r=']') then exit(true)
else exit(false);
end; procedure print(l,r:Longint);
var
k,ans:longint;
begin
if l>r then exit;
if l=r then
begin
if (st[l]=')')or(st[l]='(') then write('()')
else write('[]');
exit;
end;
ans:=d[l][r];
if match(st[l],st[r]) and (ans=d[l+1][r-1])then begin
write(st[l]);
print(l+1,r-1);
write(st[r]);
end else
for k:=l to r-1 do
if ans=d[l][k]+d[k+1][r] then
begin
print(l,k);
print(k+1,r);
exit;
end;
end;
begin
assign(input,'dp1.in');
assign(output,'dp1.out');
reset(input);
rewrite(output);
readln(st);
n:=length(st);
fillchar(d,sizeof(d),0);
for i:=1 to n do
d[i][i]:=1;
for i:=n-1 downto 1 do
for j:=i+1 to n do
begin
d[i][j]:=n;
boo:=match(st[i],st[j]);
if boo then
d[i][j]:=min(d[i][j],d[i+1][j-1]);
for k:=i to j-1 do
d[i][j]:=min(d[i][j],d[i][k]+d[k+1][j]);
end;
writeln(d[1][n]);
print(1,n);
close(input);
close(output);
end.

为了这个程序煞费苦心,我真是渣渣到爆了……

自己好不容易写的一大段因为head hole big open被删了,删完才发现稍作改动就是对的啊……

于是因为生病实在没有坚持下来,看了题解再打的一遍。。

明天九月最后一天,距离初赛还有11天,

我天嘞困死了……

DP专题——括号序列的更多相关文章

  1. 合法括号序列(dp+组合数学)

    键盘上有左括号(,右括号),和退格键-,共三个键. 牛牛希望按键n次,使得输入的字符串恰好一个合法的括号序列. 每按一次左括号(,字符串末尾追加一个左括号( 每按一次右括号),字符串末尾追加一个右括号 ...

  2. [BZOJ 4350]括号序列再战猪猪侠 题解(区间DP)

    [BZOJ 4350]括号序列再战猪猪侠 Description 括号序列与猪猪侠又大战了起来. 众所周知,括号序列是一个只有(和)组成的序列,我们称一个括号 序列S合法,当且仅当: 1.( )是一个 ...

  3. Neko and Aki's Prank CodeForces - 1152D (括号序列,dp)

    大意: 将所有长度为2*n的合法括号序列建成一颗trie树, 求trie树上选出一个最大不相交的边集, 输出边集大小. 最大边集数一定不超过奇数层结点数. 这个上界可以通过从底层贪心达到, 所以就转化 ...

  4. 【区间DP】codevs3657 括号序列题解

    题目描述 Description 我们用以下规则定义一个合法的括号序列: (1)空序列是合法的 (2)假如S是一个合法的序列,则 (S) 和[S]都是合法的 (3)假如A 和 B 都是合法的,那么AB ...

  5. BZOJ4350: 括号序列再战猪猪侠【区间DP】

    Description 括号序列与猪猪侠又大战了起来. 众所周知,括号序列是一个只有(和)组成的序列,我们称一个括号序列S合法,当且仅当: 1.( )是一个合法的括号序列. 2.若A是合法的括号序列, ...

  6. 括号序列(区间dp)

    括号序列(区间dp) 输入一个长度不超过100的,由"(",")","[",")"组成的序列,请添加尽量少的括号,得到一 ...

  7. 括号序列的dp问题模型

    括号序列的dp问题模型 Codeforces314E ◦给定一个长度为n的仅包含左括号和问号的字符串,将问号变成左括号或 右括号使得该括号序列合法,求方案总数. ◦例如(())与()()都是合法的括号 ...

  8. 括号序列问题 uva 1626 poj 1141【区间dp】

    首先考虑下面的问题:Code[VS] 3657 我们用以下规则定义一个合法的括号序列: (1)空序列是合法的 (2)假如S是一个合法的序列,则 (S) 和[S]都是合法的 (3)假如A 和 B 都是合 ...

  9. bzoj 4244 括号序列dp

    将各种情况绕环等看作括号序列,括号内的区域上下都需要累加答案,左右也是 f[i][j] 代表 前i个车站已经处理完的有j个左括号的最小权值 我们可以发现,更新的来源来自于 i-1, 和 i 将上 描述 ...

随机推荐

  1. A*算法入门

    来源:http://www.cppblog.com/mythit/archive/2009/04/19/80492.aspx 在看下面这篇文章之前,先介绍几个理论知识,有助于理解A*算法. 启发式搜索 ...

  2. 栅格数据处理 RasterDataset RasterLayer Raster RasterBandCollection

    1 IRasterLayer myrasterlayer = MapControl.Map.Layer[index] as IRasterLayer;2 IRaster myRaster = myra ...

  3. Server 2003序列号

    windows2003 64位注册码 Windows 2003 R2 64bit Enterprise VOL Edition 企业版 MR78C-GF2CY-KC864-DTG74-VMT73 VP ...

  4. javascript 自调用函数 闭包

    <script type="text/javascript"> var car = {name:"lhs",model:500}; window.o ...

  5. 【SSM 1】SpringMVC、Spring和Struts的区别

    导读:近期做到的项目中,用到的框架师SSM(SpringMVC+Spring+Mybatis),那么在这之前用过SSH,这里主要是区分一下SpringMVC和Struts,但是由于SpringMVC和 ...

  6. 【Tree 2】树形结构数据呈现的非递归算法(循环)实现

    一.基本概况 上一篇博客介绍到用递归实现树结构数据的查找,那么这篇博客,我就结合自己对于树的理解,然后用一种非递归的方式进行树结构数据的处理.首先,改造数据库表设计,加入度的概念: 首先,layer的 ...

  7. java 代码判断图片格式后缀名称

    /** * 图片判断 */ private static String getFormatName(Object o) { try { // Create an image input stream ...

  8. SQLServer中char、varchar、nchar、nvarchar的区别:

    (1)       定义: char:    固定长度,存储ANSI字符,不足的补英文半角空格. nchar:   固定长度,存储Unicode字符,不足的补英文半角空格 varchar:  可变长度 ...

  9. Mac下导出chrome插件

    chrome最强大的功能之一就是插件,有时候需要给小伙伴们共享一些插件,所以需要将自己chrome中的插件打包,在mac下打包插件还是挺费劲的,在此记录. 打开chrome的扩展程序,找到要导出的插件 ...

  10. sscanf函数和正则表达式

    看了几篇介绍sscanf函数,真是发现自己好多东西没理解透,详细介绍使用在sscanf中使用正则表达式. 第一篇: 此文所有的实验都是基于下面的程序: char str[10]; for (int i ...