Brackets Sequence
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 29502   Accepted: 8402   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.

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

题目大意: 给你一贯括号序列(只包含小括号和中括号),让你找出长度最小的regular brackets sequence包含此子序列.其中的regular brackets sequence定义如下:

1)空序列是一个regular brackets sequence;

2)如果s是一个regular brackets sequence,那么[s] 也是一个regular brackets sequence,(s)也是一个regular brackets sequence.

3)如果A,B都是regular brackets sequence,那么AB也是一个regular brackets sequence.

例如:()、[]、()[] 、([]) 、([])()[()]都是regular brackets sequence。

而[[[、 (((((、 ([)] 则都不是regular brackets sequence。其中以“([)]”为例,包含它最小的regular brackets sequence有两个:()[()]或者是([])[].而你只要输出其中一个就行。

//f[i][j]表示区间i~j内需要最少的字符数能够匹配,path[i][j]表示到达该状态是哪种情况,
// -1表示第一个和最后一个,其他表示中间的分段点,然后递归输出(递归改变次序)
#include<cstdio>
#include<cstring>
using namespace std;
#define N 1010
char s[N];
int f[N][N],path[N][N];
void out(int l,int r){
if(l>r) return ;
if(l==r){//到达了最后
if(s[l]=='('||s[l]==')')
printf("()");
else
printf("[]");
return ;
}
if(path[l][r]==-){//首尾,先输出开始,然后递归输出中间,最后输出结尾
putchar(s[l]);
out(l+,r-);
putchar(s[r]);
}
else{
out(l,path[l][r]);
out(path[l][r]+,r);
}
}
int main(){
while(gets(s+)){//有空串,scanf("%s"),不能读空串,然后少一个回车,会出错
int n=strlen(s+);
for(int i=;i<=n;i++) f[i][i]=;//一个的话只需一个就可以匹配
for(int x=;x<n;x++){//枚举区间长度
for(int i=;i<=n-x;i++){//枚举区间开始位置
int j=i+x;
f[i][j]=0x3f3f3f3f;
if((s[i]=='('&&s[j]==')')||(s[i]=='['&&s[j]==']')){
if(f[i+][j-]<f[i][j]){
f[i][j]=f[i+][j-];path[i][j]=-;
}
}
for(int k=i;k<j;k++){//中间分隔情况
if(f[i][k]+f[k+][j]<f[i][j]){
f[i][j]=f[i][k]+f[k+][j];path[i][j]=k;
}
}
}
}
out(,n);
putchar('\n');
}
return ;
}
//update 2.0
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int N=;
int n,f[N][N];char s[N];
bool match(char a,char b){
if(a=='('&&b==')') return ;
if(a=='['&&b==']') return ;
return ;
}
void print(int i,int j){
if(i>j) return ;
if(i==j){
if(s[i]=='('||s[i]==')') printf("()");
else printf("[]");
return ;
}
int ans=f[i][j];
if(match(s[i],s[j])&&ans==f[i+][j-]){
printf("%c",s[i]);
print(i+,j-);
printf("%c",s[j]);
return ;
}
for(int k=i;k<j;k++){
if(ans==f[i][k]+f[k+][j]){
print(i,k);
print(k+,j);
return ;
}
}
}
int main(){
while(gets(s+)){
n=strlen(s+);
memset(f,0x3f3f3f3f,sizeof f);
for(int i=;i<=n;i++){
f[i+][i]=;
f[i][i]=;
}
for(int i=n-;i>=;i--){
for(int j=i+;j<=n;j++){
f[i][j]=n;
if(match(s[i],s[j])) f[i][j]=min(f[i][j],f[i+][j-]);
for(int k=i;k<j;k++){
f[i][j]=min(f[i][j],f[i][k]+f[k+][j]);
}
}
}
//printf("%d\n",f[1][n]);
print(,n);
putchar('\n');
}
return ;
}

POJ 1141 Brackets Sequence的更多相关文章

  1. 区间DP POJ 1141 Brackets Sequence

    Brackets Sequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 29520   Accepted: 840 ...

  2. poj 1141 Brackets Sequence 区间dp,分块记录

    Brackets Sequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 35049   Accepted: 101 ...

  3. POJ 1141 Brackets Sequence(区间DP, DP打印路径)

    Description We give the following inductive definition of a “regular brackets” sequence: the empty s ...

  4. POJ 1141 Brackets Sequence (区间DP)

    Description Let us define a regular brackets sequence in the following way: 1. Empty sequence is a r ...

  5. poj 1141 Brackets Sequence (区间dp)

    题目链接:http://poj.org/problem?id=1141 题解:求已知子串最短的括号完备的全序列 代码: #include<iostream> #include<cst ...

  6. poj 1141 Brackets Sequence(区间DP)

    题目:http://poj.org/problem?id=1141 转载:http://blog.csdn.net/lijiecsu/article/details/7589877 定义合法的括号序列 ...

  7. POJ 1141 Brackets Sequence(括号匹配二)

    题目链接:http://poj.org/problem?id=1141 题目大意:给你一串字符串,让你补全括号,要求补得括号最少,并输出补全后的结果. 解题思路: 开始想的是利用相邻子区间,即dp[i ...

  8. POJ #1141 - Brackets Sequence - TODO: POJ website issue

    A bottom-up DP. To be honest, it is not easy to relate DP to this problem. Maybe, all "most&quo ...

  9. POJ 1141 Brackets Sequence(DP)

    题目链接 很早 很早之前就看过的一题,今天终于A了.状态转移,还算好想,输出路径有些麻烦,搞了一个标记数组的,感觉不大对,一直wa,看到别人有写直接输出的..二了,直接输出就过了.. #include ...

随机推荐

  1. SAP数据更新的触发

    SAP 应用系统架构         应用层运行着DIALOG进程,每个DIALOG进程绑定一个数据库进程,DIALOG进程与GUI进行通信,每次GUI向应用服务器发送请求时都会通过dispatche ...

  2. 再议使用Python批量裁切栅格

    曾经写过<使用Python脚本批量裁切栅格>,但今天又遇到这个情况则发现了问题.我们遇到的实际问题往往是有一个需要裁剪的影像(大块的),另外有一个矢量面,现在需要按矢量面每一个要素进行裁剪 ...

  3. Android PopupWindow使用之地区、学校选择二级联动

    最近在做一个社交类APP时,希望用户在注册时根据地区来选择自己所在的学校,由于用户手动输入学校,可能会出现各种问题,不利于后面对用户信息的统计.于是决定在客户端做好设置,用户只要根据地区来选择就好.第 ...

  4. 多种cell混合使用

    有时候我们会碰到一个tableView上有多种cell,这个时候就需要定义多种cell,根据条件判断,当满足某个条件的时候选择某个cell 先看plist文件: Person.h #import &l ...

  5. iOS开发笔记11:表单键盘遮挡、浮点数价格格式化显示、省市区选择器、View Debugging

    1.表单键盘遮挡 应用场景为一个collectionView上有多个textfield.textView供用户填写信息. 之前输入项较少时,采取的方法比较粗暴,didSelectItemAtIndex ...

  6. IOS之UI--小实例项目--添加商品和商品名

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  7. java微信接口之四—上传素材

    一.微信上传素材接口简介 1.请求:该请求是使用post提交地址为: https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token=A ...

  8. subline 快捷键

    subline 快捷键  安装 pretty css  html  后1,CTRl+ shift +H 格式化代码

  9. Syslog-ng

    一.简介 与 syslog相比 ,syslog-ng 具有众多高级的功能:更好的网络支持,更加方便的配置,集中式的网络日志存储,并且更具有弹性.比如,使用syslogd时,所有的iptables日志与 ...

  10. Linux下集群的搭建

    1.集群的简介: 集群(cluster)技术是一种较新的技术,通过集群技术,可以在付出较低成本的情况下获得在性能.可靠性.灵活性方面的相对较高的收益,其任务调度则是集群系统中的核心技术. 如果一个事情 ...