3657 括号序列 动态规划

3657 括号序列

我们用以下规则定义一个合法的括号序列:

(1)空序列是合法的

(2)假如S是一个合法的序列,则 (S) 和[S]都是合法的

(3)假如A 和 B 都是合法的,那么AB和BA也是合法的

例如以下是合法的括号序列:

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

以下是不合法括号序列的:

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

 现在给定一些由'(', ')', '[', ,']'构成的序列 ,请添加尽量少的括号,得到一个合法的括号序列。

 

输入描述 Input Description

输入包括号序列S。含最多100个字符(四种字符: '(', ')', '[' and ']') ,都放在一行,中间没有其他多余字符。

 

输出描述 Output Description

使括号序列S成为合法序列需要添加最少的括号数量。

 

样例输入 Sample Input

   

([()

 

样例输出 Sample Output

   

2

 

数据范围及提示 Data Size & Hint

   

【样例说明】
最少添加2个括号可以得到合法的序列:()[()]或([()])
【数据范围】
S的长度<=100 (最多100个字符)。

 

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<sstream>
#include<algorithm>
#include<queue>
#include<deque>
#include<iomanip>
#include<vector>
#include<cmath>
#include<map>
#include<stack>
#include<set>
#include<memory>
#include<list>
#include<string>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
#define MAXN 109
#define L 31
#define INF 1000000009
#define eps 0.00000001

char str[MAXN];
int dp[MAXN][MAXN];

int main()
{
    scanf("%s", str);
    int l = strlen(str);
    memset(dp, INF, sizeof(dp));
    for (int i = 0; i < l; i++)
        dp[i][i] = 1;
    for (int i = 1; i < l; i++)
    {
        if ((str[i - 1] == '('&&str[i] == ')') || str[i - 1] == '['&&str[i] == ']')
            dp[i - 1][i] = 0;
        else
            dp[i - 1][i] = 2;
    }
    for (int k = 2; k < l; k++)
    {
        for (int i = 0; i < l; i++)
        {
            int j = i + k;
            if (j >= l)
                break;
            if ((str[i] == '('&&str[j] == ')') || (str[i] == '['&&str[j] == ']'))
                dp[i][j] = min(dp[i][j], dp[i + 1][j - 1]);
            if (str[i] == '(' || str[i] == '[')
                dp[i][j] = min(dp[i + 1][j] + 1, dp[i][j]);
            if (str[j] == ')'&&str[j] == ']')
                dp[i][j] = min(dp[i][j - 1] + 1, dp[i][j]);
            for (int k = i ; k <= j; k++)
                dp[i][j] = min(dp[i][k] + dp[k + 1][j], dp[i][j]);
        }
    }
    printf("%d\n", dp[0][l - 1]);
}

 

posted @ 2017-08-12 16:56  joeylee97  阅读(1089)  评论(0编辑  收藏  举报