• POJ 1141 Brackets Sequence


    Brackets Sequence
    Time Limit: 1000MS   Memory Limit: 65536K
            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

     
    区间dp记录路径,结合了上两题的括号匹配+回文串修改。。
    注意空行
     1 #include<set>
     2 #include<cstdio>
     3 #include<cstdlib>
     4 #include<cstring>
     5 #include<iostream>
     6 #include<algorithm>
     7 using namespace std;
     8 const int N = 110;
     9 #define For(i,n) for(int i=1;i<=n;i++)
    10 #define Rep(i,l,r) for(int i=l;i<=r;i++)
    11 #define Down(i,r,l) for(int i=r;i>=l;i--)
    12 
    13 struct State{
    14     int v,op;
    15 }dp[N][N];
    16 
    17 char st[N];
    18 int n;
    19 
    20 bool match(int x,int y){
    21     if(st[x]=='(') return (st[y]==')');
    22     if(st[x]=='[') return (st[y]==']');
    23     return false;
    24 }
    25 void DP(){
    26     n=strlen(st+1);
    27     For(i,n)
    28       For(j,n)
    29         if(j<i)  dp[i][j].v=0;
    30         else     dp[i][j].v=214748364;
    31     For(i,n) dp[i][i].v=1;
    32     Down(i,n-1,1)
    33       Rep(j,i,n){
    34           if(match(i,j))
    35             if(dp[i][j].v>dp[i+1][j-1].v){
    36                 dp[i][j].v=dp[i+1][j-1].v;
    37                 dp[i][j].op=0;
    38             }
    39           Rep(k,i,j-1)
    40             if(dp[i][k].v+dp[k+1][j].v<dp[i][j].v){
    41                 dp[i][j].v=dp[i][k].v+dp[k+1][j].v;
    42                 dp[i][j].op=k;
    43             }
    44       }
    45 }
    46 
    47 void Print(int l,int r){
    48     if(l>r) return;
    49     if(l==r){
    50         if(st[l]=='('||st[l]==')') printf("()");
    51         if(st[l]==']'||st[l]=='[') printf("[]");
    52         return;
    53     }
    54     if(dp[l][r].op){
    55         Print(l,dp[l][r].op);
    56         Print(dp[l][r].op+1,r);
    57     }
    58     else{
    59         printf("%c",st[l]);
    60         Print(l+1,r-1);
    61         printf("%c",st[r]);
    62     }
    63 }
    64 
    65 int main(){
    66     while(gets(st+1)){
    67         if(strlen(st+1)){
    68             DP();
    69             Print(1,n);
    70         }
    71         puts("");
    72     }
    73     return 0;
    74 }
  • 相关阅读:
    存储类&作用域&生命周期&链接属性
    关于mysql数据库的备份和还原
    Centos 7下mysql的安装与配置
    基于Apache+php+mysql的许愿墙网站的搭建
    关于php留言本网站的搭建
    linux下面桌面的安装
    时间同步ntp服务的安装与配置
    通过挂载系统光盘搭建本地yum仓库的方法
    linux系统root用户忘记密码的重置方法
    linux系统的初化始配置
  • 原文地址:https://www.cnblogs.com/zjdx1998/p/4053677.html
Copyright © 2020-2023  润新知