TOJ 3295 括号序列(区间DP)

Posted taozi1115402474

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TOJ 3295 括号序列(区间DP)相关的知识,希望对你有一定的参考价值。

描述

给定一串字符串,只由 “[”、“]” 、“(”、“)”四个字符构成。现在让你尽量少的添加括号,得到一个规则的序列。

例如:“()”、“[]”、“(())”、“([])”、“()[]”、“()[()]”,都是规则的序列。这几个不是规则的,如:“(”、“[”、“]”、“)(”、“([()”。

输入

输入有多组测试数据。输入一串字符串序列,长度不大于255。

输出

输出最少添加的括号数目。

样例输入

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

样例输出

0
1
2
4
题意

如上

题解

DP[i][j]代表区间[i,j]最大匹配数

枚举长度,如果左右端点匹配,dp[l][r]=dp[l+1][r-1]+2

然后再循环k=l---r-1    dp[l][r]=max(dp[l][r],dp[l][k]+dp[k+1][r])可能区间[l,r]最大的是由[l,k][k+1,r]两个区间最大值合并而来

最后输出总长度-最大匹配dp[0][suml],suml代表序列总长度

代码

 

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     char s[255];
 9     while(scanf("%s",s)!=EOF)
10     {
11         int dp[255][255]={0};
12         int suml=strlen(s);
13         for(int len=1;len<=suml;len++)
14             for(int l=0;l+len-1<suml;l++)
15             {
16                 int r=l+len-1;
17                 if(s[l]==(&&s[r]==)||s[l]==[&&s[r]==])dp[l][r]=dp[l+1][r-1]+2;
18                 for(int k=l;k<r;k++)
19                     dp[l][r]=max(dp[l][r],dp[l][k]+dp[k+1][r]);
20             }
21         printf("%d
",suml-dp[0][suml-1]);
22     }
23     return 0;
24 }

 

 

 








以上是关于TOJ 3295 括号序列(区间DP)的主要内容,如果未能解决你的问题,请参考以下文章

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

括号匹配问题(区间dp)

POJ2955 Brackets 题解 区间DP

Brackets Sequence(区间dp+打印方案)

Codeforces149 D. Coloring Brackets(区间dp,合法括号序列性质)

UESTC 1321 柱爷的恋爱 (区间DP)