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)的主要内容,如果未能解决你的问题,请参考以下文章