zoukankan      html  css  js  c++  java
  • poj 1141 Brackets Sequence 区间dp,分块记录

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

    ()[()]

    题意:用最少的括号,补全答案。

    看完题目第一想法可能是,不停地往读入的字符串中插入括号,但这样很难判断哪些是已有的匹配括号。

    所以我们可以用一个二维数组pos记录片段,用dp记录区域间最少的的需要补全的括号。

    初始化dp[i][i]为1,然后更新dp时顺便更新pos。
    然后按pos更新。

    注:这题目不知道什么鬼,最后需要输出一个 ' ',否则wa。
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <string>
    #include <map>
    #include <stack>
    #include <vector>
    #include <set>
    #include <queue>
    #define INF 0x3f3f3f3f
    typedef long long ll;
    using namespace std;
    const int N=256;
    char s[N];
    int dp[N][N],pos[N][N];
    
    bool march(char a,char b)
    {
          if(a=='('&&b==')'||a=='['&&b==']')
                return true;
          else
                return false;
    }
    
    void print(int i,int e)
    {
          if(i>e)
                return;
          else if(i==e)
          {
                if(s[i]=='('||s[i]==')')
                      printf("()");
                else if(s[i]=='['||s[i]==']')
                      printf("[]");
    
          }
          else if(pos[i][e]==-1)
          {
                printf("%c",s[i]);
                print(i+1,e-1);
                printf("%c",s[e]);
          }
          else
          {
                print(i,pos[i][e]);
                print(pos[i][e]+1,e);
          }
    }
    
    int main()
    {
        //  freopen("input.txt","r",stdin);
          gets(s);
       //   cin>>s;
          int len=strlen(s);
          memset(dp,0,sizeof dp);
          memset(pos,0,sizeof pos);
          for(int i=0;i<len;i++)
          {
                dp[i][i]=1;
          }
          for(int l=1;l<len;l++)
          {
                for(int i=0;l+i<len;i++)
                {
                      int e=l+i;
                      dp[i][e] = 0x7fffffff;
                      if(march(s[i],s[e]))
                      {
                            dp[i][e]=dp[i+1][e-1];
                            pos[i][e]=-1;
    //                        cout<<"匹配:"<<i<<' '<<e<<' '<<dp[i][e]<<endl;
                      }
    
                      for(int j=i;j<e;j++)
                      {
                            if(dp[i][e]>dp[i][j]+dp[j+1][e])
                            {
                                  dp[i][e]=dp[i][j]+dp[j+1][e];
                                  pos[i][e]=j;
              //                    cout<<i<<' '<<e<<' '<<dp[i][e]<<endl;
                            }
                      }
                }
          }
          print(0,len-1);
          printf("
    ");
    }
  • 相关阅读:
    Linux工具之man手册彩色页设置
    使用bakefile编译C工程代码
    学会使用简单的 MySQL 常用操作
    Mysql数据库的通用安装方法
    从Mysql数据库中导入导出表结构
    CentOS下安装MySQL数据库
    lua函数调用
    innodb记录延迟删除对于其它DB操作的影响
    从apache派生cgi工作路径看软链接
    两台主机互为网关是否会像打乒乓球一样一直互发
  • 原文地址:https://www.cnblogs.com/zgncbsylm/p/10593482.html
Copyright © 2011-2022 走看看