UVA1626 - Brackets sequence(区间DP--括号匹配+递归打印)
2015-03-12 22:20
316 查看
题目描述:
定义合法的括号序列如下:
1 空序列是一个合法的序列
2 如果S是合法的序列,则(S)和[S]也是合法的序列
3 如果A和B是合法的序列,则AB也是合法的序列
例如:下面的都是合法的括号序列
(), [], (()), ([]), ()[], ()[()]
下面的都是非法的括号序列
(, [, ), )(, ([)], ([(]
给定一个由'(', ')', '[', 和 ']' 组成的序列,找出以该序列为子序列的最短合法序列。
思路:真是经典的题目,区间DP,题目居然有陷阱,输入可能是空串,所以用scanf的时候,会不读入,就少了一次读入,wa
所以用gets
定义合法的括号序列如下:
1 空序列是一个合法的序列
2 如果S是合法的序列,则(S)和[S]也是合法的序列
3 如果A和B是合法的序列,则AB也是合法的序列
例如:下面的都是合法的括号序列
(), [], (()), ([]), ()[], ()[()]
下面的都是非法的括号序列
(, [, ), )(, ([)], ([(]
给定一个由'(', ')', '[', 和 ']' 组成的序列,找出以该序列为子序列的最短合法序列。
思路:真是经典的题目,区间DP,题目居然有陷阱,输入可能是空串,所以用scanf的时候,会不读入,就少了一次读入,wa
所以用gets
// Accepted C++ 1.002 2015-03-12 13:34:47 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int inf= 0x3f3f3f3f; int dp[105][105]; char str[105]; int n; bool match(char a,char b) { if(a=='('&&b==')') return true; else if(a=='[' && b==']') return true; return false; } void print(int l,int r) //递归打印解 { if(l>r) return ; if(l==r) { if(str[l]=='('||str[l]==')') printf("()"); else if(str[l]=='['||str[l]==']') printf("[]"); return ; } if(match(str[l],str[r])&&dp[l][r]==dp[l+1][r-1]) //别忘了match(str[l],str[r]),因为dp[l][r]==dp[l+1][r-1]时候,不一定外侧括号匹配,很容易错 { putchar(str[l]); print(l+1,r-1); putchar(str[r]); return ; } for(int k=l;k<r;k++) if(dp[l][r]==dp[l][k]+dp[k+1][r]) { print(l,k); print(k+1,r); return; } } int main() { int T; scanf("%d",&T); getchar();//吃掉T之后的换行 while(T--) { getchar(); //每个输入前都有一个空行 gets(str+1); n=strlen(str+1); memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) dp[i][i]=1; //边界 for(int l=1;l<n;l++) for(int p=1;p+l<=n;p++) { dp[p][p+l] = inf ; if(match(str[p],str[p+l])) dp[p][p+l]=dp[p+1][p+l-1]; for(int k=p ; k<p+l ;k++) dp[p][p+l]=min(dp[p][p+l],dp[p][k]+dp[k+1][p+l]); } if(n) print(1,n); puts(""); if(T) putchar('\n'); //输出之间要输出空行 } return 0; }
相关文章推荐
- UVA1626 - Brackets sequence(区间DP--括号匹配+递归打印)
- UVA1626Brackets sequence(区间DP--括号匹配+递归打印)
- 区间dp模型之括号匹配打印路径 poj(1141)
- POJ 1141-Brackets Sequence(区间dp括号匹配打印路径)
- 区间dp模型之括号匹配打印路径 poj(1141)
- POJ1141 Brackets Sequence (最小括号匹配升级版:区间DP+打印路径)
- poj1141Brackets Sequence(区间dp括号匹配打印路径)
- NYOJ15-括号匹配(二)-区间DP
- nyoj 15 括号匹配(二)(区间DP)
- POJ 2955 括号匹配,区间DP
- Brackets sequence UVA - 1626 (典型的区间dp+递归打印路径)
- 区间DP问题(矩阵连乘,石子合并,括号匹配)
- 【区间DP】NYOJ 737石子合并+POJ 2955 Brackets(括号匹配)+NYOJ 15 括号匹配(二)
- ★Uva 1626 && POJ 1141 Brackets sequence 详细题解(区间DP+递归打印)
- poj 2955 Brackets 括号匹配 区间dp
- nyoj 15 括号匹配(二)(区间DP)
- nyoj 括号匹配(二)(区间dp)
- NYOJ 括号匹配(二) 区间DP
- NYOJ15-括号匹配(二)-区间DP
- [poj2955/nyoj15]括号匹配(区间dp)