首页 > 代码库 > 3295: 括号序列 -(序列DP)
3295: 括号序列 -(序列DP)
描述
给定一串字符串,只由 “[”、“]” 、“(”、“)”四个字符构成。现在让你尽量少的添加括号,得到一个规则的序列。
例如:“()”、“[]”、“(())”、“([])”、“()[]”、“()[()]”,都是规则的序列。这几个不是规则的,如:“(”、“[”、“]”、“)(”、“([()”。
输入
输入有多组测试数据。输入一串字符串序列,长度不大于255。
输出
输出最少添加的括号数目。
样例输入
样例输出
题目来源
椒江校区第一届C语言编程大赛
这个题是问需要添加多少个括号使之成为合 法括号序列,那么我们可以先求有多少合法 的括号匹配,然后用字符串长度减去匹配的 括号数就行 状态转移方程主要是对于我们枚举的区间 dp[i][j],如果i和j处的括号能够匹配,则 dp[i][j]=dp[i+1][j-1]+1; 因为我们是从小到大枚举长度,所以小长 度 的区间一定是最优的,所以当 i 与 j 匹配 时,则是子区间的最优值+1
1 /* 2 3 */ 4 #include<iostream> 5 #include<cstring> 6 #include<cstdio> 7 #include<cmath> 8 using namespace std; 9 string s;10 int f[500][500];11 int main() {12 while(cin>>s){13 memset(f,0,sizeof f); 14 int n=s.size();15 for(int w=1;w<=n;w++) f[w][w]=1;16 for(int l=2;l<=n;l++)17 for(int i=1;i<=n-l+1;++i)18 {19 int j=l+i-1;20 f[i][j]=2147483647;21 if((s[i-1]==‘(‘&&s[j-1]==‘)‘)||(s[i-1]==‘[‘&&s[j-1]==‘]‘))f[i][j]=f[i+1][j-1];22 for(int k=i;k<=j-1;k++)23 f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]); 24 } 25 printf("%d\n",f[1][n]);26 }27 return 0;28 }
3295: 括号序列 -(序列DP)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。