zoukankan      html  css  js  c++  java
  • 括号匹配 区间DP (经典)

    描述给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来。
    如:
    []是匹配的
    ([])[]是匹配的
    ((]是不匹配的
    ([)]是不匹配的

     
    输入
    第一行输入一个正整数N,表示测试数据组数(N<=10)
    每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度不超过100
    输出
    对于每组测试数据都输出一个正整数,表示最少需要添加的括号的数量。每组测试输出占一行
    样例输入
    4
    []
    ([])[]
    ((]
    ([)]
    样例输出
    0
    0
    3
    2
    dp[i][j]表示区间i~j内需要添加的最小个数。那么如果s[i]与s[i+len],len表示区间长度,那么dp[i][j]=min(dp[i][j],dp[i+1][j-1]);
    然后还要和二部分区间合并的情况进行判断。
    /*
        dp[i][j]表示区间i~j需要添加的最小数
    */
    #include<stdio.h>
    #include<string.h>
    #define INF 9999999
    const int maxn = 120;
    char s[maxn];
    int dp[maxn][maxn];
    int min(int x,int y)
    {
        return x<y?x:y;
    }
    int main()
    {
        int i,j,k,t;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%s",s);
            int len=strlen(s);
            memset(dp,0,sizeof(dp));
            for(i=0;i<len;i++)
                dp[i][i]=1;
            for(k=1;k<len;k++)
            {
                for(i=0;i<len-k;i++)
                {
                    dp[i][i+k]=INF;
                    if((s[i]=='('&&s[i+k]==')')||(s[i]=='['&&s[i+k]==']'))
                        dp[i][i+k]=min(dp[i][i+k],dp[i+1][i+k-1]);
                    for(j=i;j<i+k;j++)
                    {
                        dp[i][i+k]=min(dp[i][i+k],dp[i][j]+dp[j+1][i+k]);
                    }
                }
            }
            printf("%d
    ",dp[0][len-1]);
        }
    }
  • 相关阅读:
    next_permutation
    P1087 FBI树
    P4047 [JSOI2010]部落划分
    买礼物
    P2121 拆地毯
    Nebula Graph 在大规模数据量级下的实践和定制化开发
    深入了解kafka系列-消费者
    一分钟教你搭建WebRTC流媒体服务器Janus-gateway
    什么是"前端工程化"?
    斗鱼Juno 监控中心的设计与实现
  • 原文地址:https://www.cnblogs.com/sweat123/p/4940573.html
Copyright © 2011-2022 走看看