• TZOJ 3295 括号序列(区间DP)


    描述

    给定一串字符串,只由 “[”、“]” 、“(”、“)”四个字符构成。现在让你尽量少的添加括号,得到一个规则的序列。

    例如:“()”、“[]”、“(())”、“([])”、“()[]”、“()[()]”,都是规则的序列。这几个不是规则的,如:“(”、“[”、“]”、“)(”、“([()”。

    输入

    输入有多组测试数据。输入一串字符串序列,长度不大于255。

    输出

    输出最少添加的括号数目。

    样例输入

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

    样例输出

    0
    1
    2
    4
    题意

    如上

    题解

    DP[i][j]代表区间[i,j]最大匹配数

    枚举长度,如果左右端点匹配,dp[l][r]=dp[l+1][r-1]+2

    然后再循环k=l---r-1    dp[l][r]=max(dp[l][r],dp[l][k]+dp[k+1][r])可能区间[l,r]最大的是由[l,k][k+1,r]两个区间最大值合并而来

    最后输出总长度-最大匹配dp[0][suml],suml代表序列总长度

    代码

     

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<algorithm>
     4 using namespace std;
     5 
     6 int main()
     7 {
     8     char s[255];
     9     while(scanf("%s",s)!=EOF)
    10     {
    11         int dp[255][255]={0};
    12         int suml=strlen(s);
    13         for(int len=1;len<=suml;len++)
    14             for(int l=0;l+len-1<suml;l++)
    15             {
    16                 int r=l+len-1;
    17                 if(s[l]=='('&&s[r]==')'||s[l]=='['&&s[r]==']')dp[l][r]=dp[l+1][r-1]+2;
    18                 for(int k=l;k<r;k++)
    19                     dp[l][r]=max(dp[l][r],dp[l][k]+dp[k+1][r]);
    20             }
    21         printf("%d
    ",suml-dp[0][suml-1]);
    22     }
    23     return 0;
    24 }
  • 相关阅读:
    Bash基本语法
    安装Ifconfig
    Centos6版本升级
    使用Lombok简化你的代码
    二、快速起步(Mysql镜像)
    一、Docker之旅
    logback.xml日志配置
    mybatis动态SQL标签的用法
    你不知道的Java类
    系统管理员需知的 16 个 iptables 使用技巧
  • 原文地址:https://www.cnblogs.com/taozi1115402474/p/9465284.html
Copyright © 2020-2023  润新知