zoukankan      html  css  js  c++  java
  • 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
    ", dp[0][l - 1]);
    }
  • 相关阅读:
    CodeForces 706C Hard problem
    CodeForces 706A Beru-taxi
    CodeForces 706B Interesting drink
    CodeForces 706E Working routine
    CodeForces 706D Vasiliy's Multiset
    CodeForces 703B Mishka and trip
    CodeForces 703C Chris and Road
    POJ 1835 宇航员
    HDU 4907 Task schedule
    HDU 4911 Inversion
  • 原文地址:https://www.cnblogs.com/joeylee97/p/7350774.html
Copyright © 2011-2022 走看看