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更新。

注:这题目不知道什么鬼,最后需要输出一个 '\n',否则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("\n");
}

 

posted on 2019-03-25 14:18  这个昵称被使用了吗  阅读(127)  评论(0编辑  收藏  举报