poj1141 bracket

15138: bracket

Time Limit
1000 ms
Memory Limit
65536 KBytes
Judge
Special Judge
Solved
36
Submit
134

Description

我们用以下方法定义正规括号序列:

1.空序列是正规括号序列

2.如果S是一个正规括号序列,那么(S) and [S]也是正规括号序列

3.如果A和B都是正规括号序列,那么AB是正规括号序列

例如,下列所有的符号序列都是正规括号序列

(), [], (()), ([]), ()[], ()[()]

而以下的符号序列都不是

(, [, ), )(, ([)], ([(]

给出一个由'(', ')', '[', 和']' 构成的符号序列,你要去找出最短的包含所给的符号序列的正规括号序列。一个序列a1 a2 ... an是另外一个序列b1 b2 ... bm的子序列,当存在这么一种情况(有1 = i1 < i2 < ... < in = m, 有 aj = bij (1< = j< = n.))

Input Format

输入文件包括最多100个括号符号(符号可以是(', ')', '[' 和']'),这些符号在同一行并且中间没有其它的符号

Output Format

写到输出文件的只有一行数据,即为长度最小的,所给括号序列是其子序列的正规括号序列。

Sample Input

([(]

Sample Output

()[()]

Hint

此题可以在 http://poj.org/problem?id=1141 提交

Poj提交前请看页面下“Discuss”

#include <stdio.h>
#include <iostream>
#define re register
using namespace std;

string s;
int f[101][101];

inline int min(int x,int y) {return x<y?x:y;}

void print(int l,int r) {
    if(l>r) return ;
    if(l==r) {
        if(s[l]=='(' || s[l]==')') cout<<"()";
        else cout<<"[]";
        return ;
    }
    if(f[l][r]==f[l+1][r-1] && s[l]=='(' && s[r]==')') {
        cout<<s[l];
        print(l+1,r-1);
        cout<<s[r];
        return ;
    }
    if(f[l][r]==f[l+1][r-1] && s[l]=='[' && s[r]==']') {
        cout<<s[l];
        print(l+1,r-1);
        cout<<s[r];
        return ;
    }
    for(re int k=l; k<=r-1; ++k) 
        if(f[l][r]==f[l][k]+f[k+1][r]) {
            print(l,k);
            print(k+1,r);
            return ;
        }
}

int main() {
    cin>>s;
    int N=s.length()-1;
    for(re int i=0; i<=N; ++i) f[i][i]=1;
    for(re int i=N-1; i>=0; --i)  
        for(re int j=i+1; j<=N; ++j) {
            f[i][j]=0x7fffffff;
            if(s[i]=='(' && s[j]==')' || s[i]=='[' && s[j]==']')
                f[i][j]=min(f[i][j],f[i+1][j-1]);
            for(re int k=i; k<=j-1; ++k)
                f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]);
        }
    print(0,N);
    return 0;
}

 

posted @ 2018-08-25 16:12  真·Alkri  阅读(116)  评论(0编辑  收藏  举报