• 138.括号序列(区间型DP)


    3657 括号序列

     

     时间限制: 1 s
     空间限制: 256000 KB
     题目等级 : 黄金 Gold
    题目描述 Description

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

    (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 >
    using namespace std;
    char p[101];
    int f[101][101];
    #include< cstdio >
    #include< cstring >
    int main()
    {
    scanf("%s",p+1);
    int lena=strlen(p+1);
    for(int i=1;i<=lena;++i)
     f[i][i]=1;
    for(int i=lena-1;i>=1;--i)
     for(int j=i+1;j<=lena;++j)
     {
        f[i][j]=9999999;
       for(int k=i;k<=j-1;++k)
       {
        if(((p[i]=='('&&p[j]==')')||(p[i]=='['&&p[j]==']'))&&i+1==j) f[i][j]=0; 
        if(((p[i]=='('&&p[j]==')')||(p[i]=='['&&p[j]==']'))&&i+1!=j)
        f[i][j]=min(min(f[i][j],f[i+1][j-1]),f[i][k]+f[k+1][j]);
        else f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]);
    }
          }
    printf("%d ",f[1][lena]);
    return 0;
    }
  • 相关阅读:
    记事本02
    助人快乐:笔记本连网
    高性能 架构实例 学习笔记
    食.运动.阅读
    The server name ... address could not be resolved
    Mysql 远程访问
    CSS布局 UI 学习笔记
    MySql 修改root密码
    C#:String类型中的CharAt 方法
    La_Lb_Lc
  • 原文地址:https://www.cnblogs.com/c1299401227/p/5370676.html
Copyright © 2020-2023  润新知