POJ 1141 Brackets Sequence(記錄路徑的dp)

畫船聽雨發表於2014-03-26

這是在看書的時候遇到的一到練習題,演算法設計程式設計實驗P200.但是感覺書上寫錯了啊P201的判斷if((str[i] == '(' && str[j] == ')') || (str[i] == '[' && str[j] == ']'))之後不能直接返回而作者寫了continue。此時匹配的不一定是最優啊。

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

()[()]
#include <algorithm>
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <iomanip>
#include <stdio.h>
#include <string>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
#include <set>
#define eps 1e-7
#define M 1000100
#define LL __int64
//#define LL long long
#define INF 0x7fffffff
#define PI 3.1415926535898

using namespace std;

const int maxn = 110;

int dp[maxn][maxn];
int pre[maxn][maxn];
char str[maxn];


void dfs_printf(int i, int j)
{
    if(i > j)
        return;
    if(i == j)
    {
        if(str[i] == '(' || str[i] == ')')
            cout<<"()";
        else
            cout<<"[]";
    }
    else
    {
        if(pre[i][j] == -1)
        {
            cout<<str[i];
            dfs_printf(i+1, j-1);
            cout<<str[j];
        }
        else
        {
            dfs_printf(i, pre[i][j]);
            dfs_printf(pre[i][j]+1, j);
        }
    }
}

int main()
{
    cin >>str;
    int n = strlen(str);
    memset(dp, 0 , sizeof(dp));
    for(int i = 0; i < n; i++)
        dp[i][i] = 1;
    for(int r = 1; r < n; r++)
    {
        for(int i = 0; i < n-r; i++)
        {
            int j = i+r;
            dp[i][j] = INF;
            if((str[i] == '(' && str[j] == ')') || (str[i] == '[' && str[j] == ']'))
            {
                dp[i][j] = dp[i+1][j-1];
                pre[i][j] = -1;
            }
            for(int k = i; k < j; k++)
            {
                if(dp[i][j] > dp[i][k]+dp[k+1][j])
                {
                    pre[i][j] = k;
                    dp[i][j]=dp[i][k]+dp[k+1][j];
                }
            }
        }
    }
    dfs_printf(0, n-1);
    cout<<endl;
    return 0;
}


相關文章