zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    Winform中如何禁用最大化或最小化按钮
    联想笔记本白屏解决办法
    SqlSever查询当前数据库某个表的名称、列名称、列说明
    离线安装Microsoft SQL Server 2016时Microsoft R Open和Microsoft R Server的问题
    SqlSever查询当前数据库的所有表名及其描述
    Windows10系统C盘的ESD文件夹是什么?可以删除吗?
    飞秋截图的快捷键是什么?
    打开Word时报错:Cannot find the Word document template:WordToRqm.dot
    .Net Core 2.1 上传文件后保存在根目录下的文件夹中,但是通过网页链接访问不了
    Winform弹出确认窗口
  • 原文地址:https://www.cnblogs.com/zjdx1998/p/4053677.html
Copyright © 2011-2022 走看看