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。设dp[i][j]为从i到j须要加入最少括号的数目。

dp[i][j] = max{ dp[i][k]+dp[k+1][j] }  (i<=k<j)

假设s[i] == s[j] , dp[i][j] 还要和dp[i+1][j-1]比較。 枚举顺序依照区间长度枚举。

由于要求输出合法序列,就要记录在原序列在哪些位置进行了添加,设c[i][j]为从i到j的 添加括号的位置,假设不须要添加。那么c[i][j] 赋为-1,打印时仅仅需递归打印就可以。

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
typedef long long LL;
const int MAX=0x3f3f3f3f;
int n,c[105][105],dp[105][105];
char s[105];
void print(int i,int j) {
if( i>j ) return ;
if( i == j ) {
if(s[i] == '(' || s[i] == ')') printf("()");
else printf("[]");
return ;
}
if( c[i][j] > 0 ) {  // i到j存在添加括号的地方,位置为c[i][j]
print(i,c[i][j]);
print(c[i][j]+1,j);
} else {
if( s[i] == '(' ) {
printf("(");
print(i+1,j-1);
printf(")");
} else {
printf("[");
print(i+1,j-1);
printf("]");
}
}
}
void DP() {  //区间DP
for(int len=2;len<=n;len++)
for(int i=1;i<=n-len+1;i++) {
int j = i+len-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];
c[i][j] = k;  // 记录断开的位置
}
if( ( s[i] == '(' && s[j] == ')' || s[i] == '[' && s[j] == ']' ) && dp[i][j] > dp[i+1][j-1] ) {
dp[i][j] = dp[i+1][j-1];
c[i][j] = -1; //i到j不须要断开。由于dp[i+1][j-1]的值更小,上面枚举的k位置都比这个大。所以不再断开
}
}
}
int main()
{
scanf("%s",s+1);
n = strlen(s+1);
memset(c,-1,sizeof(c));
memset(dp,MAX,sizeof(c));
for(int i=1;i<=n;i++) dp[i][i] = 1, dp[i][i-1] = 0; //赋初值
DP();
print(1,n);
printf("\n");
return 0;
}



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

  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,分块记录

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

  3. poj 1141 Brackets Sequence (区间dp)

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

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

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

  5. 区间DP POJ 1141 Brackets Sequence

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

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

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

  7. POJ 2955 Brackets (区间dp入门)

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

  8. POJ 1141 Brackets Sequence

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

  9. Poj 2955 brackets(区间dp)

    Brackets Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7795   Accepted: 4136 Descript ...

随机推荐

  1. 【转】Unicode utf8等编码类型的原理

    原文地址http://www.cnblogs.com/daxiong2014/p/4768681.html Unicode utf8等编码类型的原理 1.ASCII码  我们知道,在计算机内部,所有的 ...

  2. linux shell脚本监控进程是否存在

    用shell脚本监控进程是否存在 不存在则启动的实例,先上代码干货:    #!/bin/shps -fe|grep processString |grep -v grepif [ $? -ne 0 ...

  3. hive查询语法

    1.创建表: >create table value_data(citing INT,cited INT) >row format delimited >fields termina ...

  4. 第一个 XMLHttpRequest 例子(API)

    [API] https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest [替代方案] 如果不想自己敲代码,可以直接访问以下URL测试 ...

  5. P1438 无聊的数列 (线段树)

    题目链接 Solution 直接维护一个差分的线段树就好了. 其中线段树的节点代表 \(r\) 比 \(l\) 多多少. Code #include<bits/stdc++.h> #def ...

  6. Java面试题之notify和notifyAll的区别

    锁池: 假设线程A已经拥有对象锁,线程B.C想要获取锁就会被阻塞,进入一个地方去等待锁的等待,这个地方就是该对象的锁池: 等待池: 假设线程A调用某个对象的wait方法,线程A就会释放该对象锁,同时线 ...

  7. [暑假集训--数位dp]hdu5787 K-wolf Number

    Alice thinks an integer x is a K-wolf number, if every K adjacent digits in decimal representation o ...

  8. 在vue路由当中使用keep-alive避免多次加载组件,减少消耗

    今天在vue当中使用了full-page这个组件.但是发现在每次路由跳转完之后,再回到使用fullpage的这个页面,fullpage会报错,fullpage只能初始化一次. 这个时候给路由使用kee ...

  9. CSS实现Footer固定底部,超过一屏自动撑开

    方法一:给html.body都设置100%的高度,确定body下内容设置min-height有效,然后设置主体部分min-height为100%,此时若没有header.footer则刚好完美占满全屏 ...

  10. 【MFC】MFC中使对话框变成圆角矩形的代码(转)

    原文转自 http://blog.csdn.net/cracent/article/details/48274469 BOOL CLoginDlg::OnInitDialog() { CDialog: ...