poj 1141 Brackets Sequence

Brackets Sequence

Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 32662   Accepted: 9441   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

Northeastern Europe 2001

思路:DP,见代码。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
char s[1101];
int f[1101][1101],c[1101][1101];
void print(int l,int r){
    if(l>r)    return ;
    if(l==r)
        if(s[l]==‘(‘||s[l]==‘)‘)    printf("()");
        else printf("[]");
    else
        if(c[l][r]>=0){
            print(l,c[l][r]);
            print(c[l][r]+1,r);
        }
        else{
            if(s[l]==‘(‘){
                printf("(");
                print(l+1,r-1);
                printf(")");
            }
            else{
                printf("[");
                print(l+1,r-1);
                printf("]");
            }
        }
}
int main(){
    gets(s);
    int len=strlen(s);
    for(int i=0;i<len;i++)    f[i][i]=1;
    for(int i=0;i<len;i++)
        for(int j=0;j<len;j++)
            c[i][j]=-1;
    for(int l=1;l<len;l++)
        for(int i=0;i+l<len;i++){
            int j=i+l;
            int minn=f[i][i]+f[i+1][j];
            c[i][j]=i;
            for(int k=i+1;k<j;k++){
                if(minn>f[i][k]+f[k+1][j])    c[i][j]=k;//枚举断点
                minn=min(minn,f[i][k]+f[k+1][j]);
            }
            f[i][j]=minn;
            if((s[i]==‘(‘&&s[j]==‘)‘)||(s[i]==‘[‘&&s[j]==‘]‘)){
                if(f[i][j]>f[i+1][j-1])    c[i][j]=-1;
                f[i][j]=min(f[i][j],f[i+1][j-1]);
            }
         }
    print(0,len-1);
    cout<<endl;
}
/*
d[i][j]为输入序列从下标i到下标j最少需要加多少括号才能成为合法序列。0<=i<=j<len (len为输入序列的长度)。
c[i][j]为输入序列从下标i到下标j的断开位置,如果没有断开则为-1。
当i==j时,d[i][j]为1
当s[i]==‘(‘ && s[j]==‘)‘ 或者 s[i]==‘[‘ && s[j]==‘]‘时,d[i][j]=d[i+1][j-1]
否则d[i][j]=min{d[i][k]+d[k+1][j]}(i<=k<j)c[i][j]记录断开的位置k
采用递推方式计算d[i][j]

输出结果时采用递归方式输出print(0, len-1)
输出函数定义为print(int i, int j),表示输出从下标i到下标j的合法序列
当i>j时,直接返回,不需要输出
当i==j时,d[i][j]为1,至少要加一个括号,如果s[i]为‘(‘ 或者‘)‘,输出"()",否则输出"[]"
当i>j时,如果c[i][j]>=0,说明从i到j断开了,则递归调用print(i, c[i][j]);和print(c[i][j]+1, j);
        如果c[i][j]<0,说明没有断开,如果s[i]==‘(‘ 则输出‘(‘、 print(i+1, j-1); 和")"
                                    否则输出"[" print(i+1, j-1);和"]"
*/ 
时间: 2024-10-22 07:33:21

poj 1141 Brackets Sequence的相关文章

uva1626 poj 1141 Brackets Sequence 区间dp 打印路径

// poj 1141 Brackets Sequence // 也是在紫书上看的一题,uva就是多了一个t组数据. // 经典区间dp // dp(i,j)表示区间[i,j]内所需要增加的括号数目 // 则分为两种情况 // 一种是s[i]和s[j]是匹配的则 // dp[i][j] = min(dp[i][j],dp[i+1][j-1]) // 另外一种情况是不匹配 // dp[i][j] = min(dp[i][j],dp[i][k]+dp[k+1][j]){i<k<j}; // 但是无

[ACM] POJ 1141 Brackets Sequence (区间动态规划)

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

POJ 1141 Brackets Sequence (区间dp 记录路径)

题目大意: 给出一种不合法的括号序列,要求构造出一种合法的序列,使得填充的括号最少. 思路分析: 如果只要求输出最少的匹配括号的数量,那么就是简单的区间dp dp[i][j]表示 i - j 之间已经合法了最少添加的括号数. 转移 就是 dp[i] [j] = min  (dp[i+1][j]+1 , dp[ i+ 1] [ k -1 ] + dp[k+1] [j] (i k 位置的括号匹配)) 其次我们要记录路径,你发现  如果 dp [i] [j] 是由 dp [i+1] [j] 转移过来的

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"\"least" problems can be solved using DP.. Reference: http://blog.sina.com.cn/s/blog_8e6023de01014ptz.html There's an important details to AC:

POJ 1141 Brackets Sequence (线性dp 括号匹配 经典题)

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

poj 1141 Brackets Sequence (区间DP)

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

区间DP [POJ 1141] Brackets Sequence

Brackets Sequence 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, th

POJ 1141 Brackets Sequence (区间DP)

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

poj 1141 Brackets Sequence dp

 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 regu