POJ 1141 Brackets Sequence
来源:互联网 发布:卡盟网站源码 编辑:程序博客网 时间:2024/05/16 02:40
Brackets Sequence
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 24393 Accepted: 6885 Special Judge
Description
Let us define a regular brackets sequence in the following way:
1. Empty sequence is a regular sequence.
2. If S is a regular sequence, then (S) and [S] are both regular sequences.
3. If A and B are regular sequences, then AB is a regular sequence.
For example, all of the following sequences of characters are regular brackets sequences:
(), [], (()), ([]), ()[], ()[()]
And all of the following character sequences are not:
(, [, ), )(, ([)], ([(]
Some sequence of characters '(', ')', '[', and ']' is given. You are to find the shortest possible regular brackets sequence, that contains the given character sequence as a subsequence. Here, a string a1 a2 ... an is called a subsequence of the string b1 b2 ... bm, if there exist such indices 1 = i1 < i2 < ... < in = m, that aj = bij for all 1 = j = n.
1. Empty sequence is a regular sequence.
2. If S is a regular sequence, then (S) and [S] are both regular sequences.
3. If A and B are regular sequences, then AB is a regular sequence.
For example, all of the following sequences of characters are regular brackets sequences:
(), [], (()), ([]), ()[], ()[()]
And all of the following character sequences are not:
(, [, ), )(, ([)], ([(]
Some sequence of characters '(', ')', '[', and ']' is given. You are to find the shortest possible regular brackets sequence, that contains the given character sequence as a subsequence. Here, a string a1 a2 ... an is called a subsequence of the string b1 b2 ... bm, if there exist such indices 1 = i1 < i2 < ... < in = m, that aj = bij for all 1 = j = n.
Input
The input file contains at most 100 brackets (characters '(', ')', '[' and ']') that are situated on a single line without any other characters among them.
Output
Write to the output file a single line that contains some regular brackets sequence that has the minimal possible length and contains the given sequence as a subsequence.
Sample Input
([(]
Sample Output
()[()]
Source
Northeastern Europe 2001
思路:dp+dfs 搜索
写了很长的代码,本以为要调试好久呢,结果没有调试,没有注意到有输入空行的时候,用的scanf输入的,给为gets后ac了
#include <iostream>#include <cstring>#include <cmath>#include <algorithm>#include <cstdio>#include <cstdlib>#define N 110#define INF 0x7fffffusing namespace std;char s1[N];char ans[2*N],temp[N];int dp[N][N];struct num{ char c,next;}a[N*4],b[N*4];int back[N],front[N],Top1,Top2,Top3;int main(){ //freopen("data.txt","r",stdin); void dfs(int l,int r); while(gets(s1)) { memset(dp,0,sizeof(dp)); int l = strlen(s1); for(int i=l-1;i>=0;i--) { s1[i+1] = s1[i]; } for(int i=1;i<=l;i++) { for(int j=i;j>=1;j--) { if(s1[i]=='['||s1[i]=='(') { if(j==i) { dp[j][i] = 1; }else { dp[j][i] = dp[j][i-1]+1; } continue; } if(j==i) { dp[j][i] = 1; continue; } int Min = INF; for(int u=i;u>=j;u--) { int s2=0,s3=0; if((s1[u]=='['&&s1[i]==']')||(s1[u]=='('&&s1[i]==')')) { if(j<=u-1) { s2+= dp[j][u-1]; } if(u+1<=i-1) { s2+=dp[u+1][i-1]; } Min = min(Min,s2); } if(j<=u-1) { s3+=(dp[j][u-1]); } if(u<=i-1) { s3+=dp[u][i-1]; } s3+=1; Min = min(Min,s3); } dp[j][i] = Min; } } memset(back,-1,sizeof(back)); memset(front,-1,sizeof(front)); Top1 = 0; Top2 = 0; dfs(1,l); Top3 = 0; for(int i=1;i<=l+1;i++) { int Top4 = 0; if(i!=1) { Top4 = 0; for(int j=back[i-1];j!=-1;j=a[j].next) { temp[Top4++] = a[j].c; } } if(i!=l+1) { for(int j=front[i];j!=-1;j=b[j].next) { temp[Top4++] = b[j].c; } } for(int j=Top4-1;j>=0;j--) { ans[Top3++] = temp[j]; } if(i!=l+1) { ans[Top3++] = s1[i]; } } ans[Top3] = '\0'; printf("%s\n",ans); } return 0;}void addeage1(int x,char c){ a[Top1].c = c; a[Top1].next = back[x]; back[x] = Top1++;}void addeage2(int x,char c){ b[Top2].c = c; b[Top2].next = front[x]; front[x] = Top2++;}void dfs(int l,int r){ if(s1[r]=='('||s1[r]=='[') { if(s1[r]=='(') { addeage1(r,')'); }else { addeage1(r,']'); } if(l<r) { dfs(l,r-1); } }else { if(l==r) { if(s1[r]==')') { addeage2(l,'('); }else { addeage2(l,'['); } return ; } int ll,lr,rl,rr; int k1=0,k2=0; for(int i=l;i<=r;i++) { int sum = 0; k1 = k2 = 0; if(l<=i-1) { sum += dp[l][i-1]; k1 = 1; ll = l; lr = i-1; } if(i<=r-1) { sum+=dp[i][r-1]; k2 = 1; rl = i; rr = r-1; } sum+=1; if(sum==dp[l][r]) { if(s1[r]==')') { addeage2(i,'('); }else { addeage2(i,'['); } break; } k1 = k2 = 0; if((s1[i]=='('&&s1[r]==')')||(s1[i]=='['&&s1[r]==']')) { sum = 0; if(l<=i-1) { sum+=dp[l][i-1]; k1 = 1; ll = l; rl = i-1; } if(i+1<=r-1) { sum+=dp[i+1][r-1]; k2 = 1; rl = i+1; rr = r-1; } if(sum==dp[l][r]) { break; } } } if(k1) { dfs(ll,lr); } if(k2) { dfs(rl,rr); } }}
0 0
- POJ 1141 Brackets Sequence
- POJ 1141 Brackets Sequence
- Brackets Sequence--poj--1141
- poj 1141 Brackets Sequence
- poj 1141 Brackets Sequence
- POJ 1141 Brackets Sequence
- POJ 1141 Brackets Sequence
- poj 1141 Brackets Sequence
- POJ 1141 Brackets Sequence
- POJ 1141 Brackets Sequence
- poj 1141(Brackets Sequence)
- poj 1141 brackets sequence
- poj 1141 Brackets Sequence
- POJ 1141 Brackets Sequence
- poj 1141 Brackets Sequence
- poj 1141 brackets sequence
- POJ-1141-Brackets Sequence
- POJ - 1141 Brackets Sequence
- 日记
- Java中的Enum的使用与分析
- javaweb整合easyui开发记录(一)
- ORACLE学习小记(2)
- AbsListView android:smoothScrollbar
- POJ 1141 Brackets Sequence
- 存储过程简单的用法
- 函数指针的使用
- 关于Netbeans的一些吐槽
- linux 关机
- spring如何访问静态文件(每天学习一点点)
- 我记得有人这样评价我,他说:文字是另一个
- 【Linux VI】 统计字符数
- flex实现百度库文浏览文档使用word文档转pdf然后再用pdf转swf最后flex页面使用flexpaper显示文库数据