poj1141 2010.2.22

来源:互联网 发布:安卓chroot ubuntu 编辑:程序博客网 时间:2024/05/22 08:26

poj1141 2010.2.22

Brackets Sequence

Time Limit: 1000MS  Memory Limit: 65536K

Total Submissions: 10822  Accepted: 2877  Special Judge

 

Description

 

Let us define a regular brackets sequencein 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, thenAB is a regular sequence.

 

For example, all of the following sequencesof characters are regular brackets sequences:

 

(), [], (()), ([]), ()[], ()[()]

 

And all of the following charactersequences are not:

 

(, [, ), )(, ([)], ([(]

 

Some sequence of characters '(', ')', '[',and ']' is given. You are to find the shortest possible regular bracketssequence, that contains the given character sequence as a subsequence. Here, astring a1 a2 ... an is called a subsequence of the string b1 b2 ... bm, ifthere exist such indices 1 = i1 < i2 < ... < in = m, that aj = bij forall 1 = j = n.

Input

 

The input file contains at most 100brackets (characters '(', ')', '[' and ']') that are situated on a single linewithout any other characters among them.

Output

 

Write to the output file a single line thatcontains some regular brackets sequence that has the minimal possible lengthand contains the given sequence as a subsequence.

Sample Input

 

([(]

Sample Output

 

()[()]

Source

 

Northeastern Europe 2001

黑书上有


#include <stdio.h>#include <string.h>#define MAXN 100+10#define INF 999999999char s[MAXN];int dp[MAXN][MAXN],path[MAXN][MAXN];void output(int,int);void output(int i,int j){if (i>j)return;if (i==j){if (s[i]=='('||s[j]==')')printf("()");elseprintf("[]");}elseif (path[i][j]==-1){printf("%c",s[i]);output(i+1,j-1);printf("%c",s[j]);}else{output(i,path[i][j]);output(path[i][j]+1,j);}}void main(){scanf("%s",s);memset(dp,0,sizeof(dp));int n=strlen(s);for(int i=0;i<n;++i)dp[i][i]=1;for(int p=1;p<n;++p)for(int i=0;i<n-p;++i){int j=i+p;dp[i][j]=INF;if ((s[i] == '(' && s[j] == ')') || (s[i] == '[' && s[j] == ']'))if(dp[i][j]>dp[i+1][j-1])dp[i][j]=dp[i+1][j-1],path[i][j]=-1;for (int k = i; k < j; ++k){if (dp[i][j] > dp[i][k] + dp[k+1][j]){dp[i][j] = dp[i][k] + dp[k+1][j];path[i][j] = k;}}}output(0,n-1);printf("\n");}


0 0
原创粉丝点击