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]);
    }
  • 相关阅读:
    Error in as.POSIXlt.character(x, tz, ...) :
    java.util.ResourceBundle使用详解
    互联网网站的反爬虫策略浅析
    基于内容的图片检索CBIR(Content Based Image Retrieval)简介
    solr
    ETL
    cv 论文(CNN相关)
    输出字符串
    Minimum_Window_Substring两种方法求解
    C++primer中的TextQuery(读取文本)
  • 原文地址:https://www.cnblogs.com/joeylee97/p/7350774.html
Copyright © 2011-2022 走看看