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

()[()]
    
 /*对于DP题目需要记录到底是怎样得到结果的,不一定了可以通过记录信息直接得到,可以选择数组记录其他有用信息,可以写递归来找出最后的答案。*/
#define N 111
#include<iostream>
using namespace std;
#include<cstring>
#include<cstdio>
#define inf (1<<31)-1
int f[N][N],pos[N][N],lens;
char s[N];
void print(int l,int r)/*输出序列的过程*/
{
if(l<=r)/*一定要有这一句,否则对于相邻的‘()’,就会死循环了*/
{
if(l==r)/*能到这一步,说明只能补上括号了*/
{
if(s[l]=='('||s[l]==')') printf("()");
if(s[l]=='['||s[l]==']') printf("[]");
}
else
{
if(pos[l][r]==-)/*说明该区间最左括号与最右匹配*/
{
printf("%c",s[l]);
print(l+,r-);/**/
printf("%c",s[r]);
}
else
{
print(l,pos[l][r]);
print(pos[l][r]+,r);
}
}
}
}
int main()
{
// freopen("bracket.in","r",stdin);
// freopen("bracket.out","w",stdout);
scanf("%s",s+);
lens=strlen(s+);
for(int i=;i<=lens;++i)
f[i][i]=;
/* for(int i=lens-1;i>=1;--i)
for(int j=i+1;j<=lens;++j)
{
f[i][j]=inf;
if(((s[i]=='('&&s[j]==')')||(s[i]=='['&&s[j]==']')))
{
f[i][j]=f[i+1][j-1];
pos[i][j]=-1;
} for(int k=i;k<=j-1;++k)
{
if(f[i][j]>f[i][k]+f[k+1][j])
{
f[i][j]=f[i][k]+f[k+1][j];
pos[i][j]=k;
} } }这两种都是可以得出正确答案的,但是我建议使用下面的,对于区间DP,最外层循环最好枚举区间长度,内层枚举区间*/
for(int k=;k<lens;++k)
for(int i=,j=i+k;j<=lens&&i<=lens;++j,++i)
{
f[i][j]=inf;
if((s[i]=='('&&s[j]==')')||(s[i]=='['&&s[j]==']'))
{
f[i][j]=f[i+][j-];
pos[i][j]=-;
}
/*不要加else,因为即使当前区间的最左和最右匹配,也不一定比放弃他们匹配优*/
for(int k=i;k<=j-;++k)
{
if(f[i][j]>f[i][k]+f[k+][j])
{
f[i][j]=f[i][k]+f[k+][j];
pos[i][j]=k;
} } }
print(,lens);
printf("\n");/*坑爹的POJ,没有这句,一直没对*/
//fclose(stdin);fclose(stdout);
return ;
}

区间DP POJ 1141 Brackets Sequence的更多相关文章

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

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

  2. POJ 1141 Brackets Sequence (区间DP)

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

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

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

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

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

  5. POJ 1141 Brackets Sequence

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

  6. poj 1141 Brackets Sequence (区间dp)

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

  7. poj 1141 Brackets Sequence(区间DP)

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

  8. poj 1141 Brackets Sequence ( 区间dp+输出方案 )

    http://blog.csdn.net/cc_again/article/details/10169643 http://blog.csdn.net/lijiecsu/article/details ...

  9. POJ 1141 Brackets Sequence(DP)

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

随机推荐

  1. 解决爬虫时网站采用gb2312编码所遇到的乱码问题!

    import requests from bs4 import BeautifulSoupall_url = 'http://www.7160.com/qingchunmeinv/' # 请求头 he ...

  2. Tomcat 调优及 JVM 参数优化

    Tomcat 本身与 JVM 优化 Tomcat:调整Server.xml JVM:bat启动服务方式的话修改catalina.bat 服务式启动的话参考:http://www.cnblogs.com ...

  3. java在CMD窗口执行程序的时候输入密码(隐藏一些敏感信息)

    有时候我们需要从CMD窗口执行一些命令,有时候会输入一些敏感的信息,比如密码之类的东西,所以我们可以从控制台读取但是不希望别人看见我们的密码: import java.io.Console; /** ...

  4. 10 - 函数嵌套-作用域-闭包-LEGB-函数销毁

    目录 1 函数嵌套 2 作用域 2.1 global关键字 3 闭包 3.1 nonlocal关键字 4 默认值的作用域 5 变量名解析原则LEGB 6 函数的销毁 1 函数嵌套         一个 ...

  5. SQLite3 使用教学

    source: SQL中文站:http://www.sqlite.com.cn/MySqlite/4/378.Html OS X自从10.4后把SQLite这套相当出名的数据库软件,放进了作业系统工具 ...

  6. Linux内存高,触发oom-killer问题解决

    最近遇到两起Linux的内存问题,其一是触发了oom-killer导致系统挂 1. 首先确认该系统的版本是32位 ? #uname -a Linux alarm 2.6.9-67.ELsmp #1 S ...

  7. pip安装使用详解【转】

    转自:pip安装使用详解 – 运维生存时间http://www.ttlsa.com/python/how-to-install-and-use-pip-ttlsa/ pip类似RedHat里面的yum ...

  8. 正排索引(forward index)与倒排索引(inverted index) (转)

    一.正排索引(前向索引) 正排索引也称为"前向索引".它是创建倒排索引的基础,具有以下字段. (1)LocalId字段(表中简称"Lid"):表示一个文档的局部 ...

  9. 网页转图片,html生成图片,网页生成图片(基于linnux+phantomjs)和wkhtmltoimage

    安装扩展:  (1)下面是我在linux上的安装过程,如果没有安装git请先yum install git    安装casperjs    cd /    git clone git://githu ...

  10. 字节对齐&&sizeof

    转:http://blog.chinaunix.net/uid-722885-id-124878.html 1. sizeof应用在结构上的情况 请看下面的结构: struct MyStruct { ...