15138: bracket
-
Time Limit
- 1000 ms Memory Limit
- 65536 KBytes Judge
- Special Judge Solved
- 36 Submit
- 134
Description
我们用以下方法定义正规括号序列:
1.空序列是正规括号序列
2.如果S是一个正规括号序列,那么(S) and [S]也是正规括号序列
3.如果A和B都是正规括号序列,那么AB是正规括号序列
例如,下列所有的符号序列都是正规括号序列
(), [], (()), ([]), ()[], ()[()]
而以下的符号序列都不是
(, [, ), )(, ([)], ([(]
给出一个由'(', ')', '[', 和']' 构成的符号序列,你要去找出最短的包含所给的符号序列的正规括号序列。一个序列a1 a2 ... an是另外一个序列b1 b2 ... bm的子序列,当存在这么一种情况(有1 = i1 < i2 < ... < in = m, 有 aj = bij (1< = j< = n.))
Input Format
输入文件包括最多100个括号符号(符号可以是(', ')', '[' 和']'),这些符号在同一行并且中间没有其它的符号
Output Format
写到输出文件的只有一行数据,即为长度最小的,所给括号序列是其子序列的正规括号序列。
Sample Input
([(]
Sample Output
()[()]
Hint
此题可以在 http://poj.org/problem?id=1141 提交
Poj提交前请看页面下“Discuss”
#include <stdio.h> #include <iostream> #define re register using namespace std; string s; int f[101][101]; inline int min(int x,int y) {return x<y?x:y;} void print(int l,int r) { if(l>r) return ; if(l==r) { if(s[l]=='(' || s[l]==')') cout<<"()"; else cout<<"[]"; return ; } if(f[l][r]==f[l+1][r-1] && s[l]=='(' && s[r]==')') { cout<<s[l]; print(l+1,r-1); cout<<s[r]; return ; } if(f[l][r]==f[l+1][r-1] && s[l]=='[' && s[r]==']') { cout<<s[l]; print(l+1,r-1); cout<<s[r]; return ; } for(re int k=l; k<=r-1; ++k) if(f[l][r]==f[l][k]+f[k+1][r]) { print(l,k); print(k+1,r); return ; } } int main() { cin>>s; int N=s.length()-1; for(re int i=0; i<=N; ++i) f[i][i]=1; for(re int i=N-1; i>=0; --i) for(re int j=i+1; j<=N; ++j) { f[i][j]=0x7fffffff; if(s[i]=='(' && s[j]==')' || s[i]=='[' && s[j]==']') f[i][j]=min(f[i][j],f[i+1][j-1]); for(re int k=i; k<=j-1; ++k) f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]); } print(0,N); return 0; }