毕竟是个渣,写完一遍之后又按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. 每天一个 Linux 命令(6):rmdir 命令

    今天学习一下linux中命令: rmdir命令.rmdir是常用的命令,该命令的功能是删除空目录,一个目录被删除之前必须是空的.(注意,rm – r dir命令可代替rmdir,但是有很大危险性.)删 ...

  2. How to force the UI to refresh immediately(WPF)

    Question 0 Sign in to vote Folks, In my application, when the user hits "Submit" button, I ...

  3. ZYB's Premutation POJ5592

    Problem Description ZYBZYBZYB has a premutation PPP,but he only remeber the reverse log of each pref ...

  4. 在win下开发c++代码, 推荐一个工具dev c++

    官方地址:http://bloodshed-dev-c.en.softonic.com/

  5. 【摘】top命令

    1.重要参数解释 VIRT:virtual memory usage.Virtual这个词很神,一般解释是:virtual adj.虚的, 实质的, [物]有效的, 事实上的.到底是虚的还是实的?让G ...

  6. Codeforces Round #228 (Div. 1) A

    A. Fox and Box Accumulation time limit per test 1 second memory limit per test 256 megabytes input s ...

  7. MFC之动态创建按钮

    打开VS 创建MFC基于对话框的工程,在对话框初始化方法中动态创建一个按钮实例: 1> CButton *pMyButton = new CButton();CEdit *pMyEdit = n ...

  8. TortoiseSVN 版本回滚

    尝试用TortoiseSVN进行版本回滚,回滚到的版本和实际的内容有出入,可能是点了太多次给点乱了,囧~ 不过发现一个比较靠谱的方法,如下: 右键点击文件TortoiseSVN->showlog ...

  9. linux文件上传

    租了个服务器,要把自己打的war包打上去发布,服务器是linux的(本机是mac).以前都是用wget命令,把需要上传的东西先放到github上面再在服务器上用wget命令下载.最近不知道什么原因,w ...

  10. PDF 生成插件 flying saucer 和 iText

    最近的项目中遇到了需求,用户在页面点击下载,将页面以PDF格式下载完成供用户浏览,所以上网找了下实现方案. 在Java世界,要想生成PDF,方案不少,所以简单做一个小结吧. 在此之前,先来勾画一下我心 ...