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");}
- poj1141 2010.2.22
- poj1141
- poj1141
- poj1141
- poj1141
- poj1141
- poj1141
- poj1141
- poj1141
- poj1141
- POJ1141 dp
- poj1141 dp
- poj1141 dp
- POJ1141 Brackets Sequence
- poj1141 括号序列 dp
- poj1141 Brackets Sequence
- POJ1141 动态规划
- poj1141 动态规划
- java操作大文件复制
- poj1023 2010.2.22
- poj2593 2010.2.22
- 【MinaFile】【八】【2.0】项目Model
- 正则表达式:Pattern类与Matcher类详解
- poj1141 2010.2.22
- PAT (Basic Level)1011. A+B和C
- poj1125 2010.2.22
- JavaScript系列(四:对象)
- 【codevs2399】【BZOJ2753】滑雪与时间胶囊,bfs+最小生成树
- 关于Python中的yield
- KeLeaveCriticalRegion routine
- poj 2528 2010.2.22
- Tips on Optimizing SQL Server Composite Indexes(SQL server 复合索引优化提示)