zoukankan      html  css  js  c++  java
  • 2015 HUAS Summer Trainning #5~J

    Description

    We give the following inductive definition of a “regular brackets” sequence:

    • the empty sequence is a regular brackets sequence,
    • if s is a regular brackets sequence, then (s) and [s] are regular brackets sequences, and
    • if a and b are regular brackets sequences, then ab is a regular brackets sequence.
    • no other sequence is a regular brackets sequence

    For instance, all of the following character sequences are regular brackets sequences:

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

    while the following character sequences are not:

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

    Given a brackets sequence of characters a1a2 … an, your goal is to find the length of the longest regular brackets sequence that is a subsequence of s. That is, you wish to find the largest m such that for indices i1, i2, …, im where 1 ≤ i1 < i2 < … < im ≤ n, ai1ai2 … aim is a regular brackets sequence.

    Given the initial sequence ([([]])], the longest regular brackets subsequence is [([])].

    Input

    The input test file will contain multiple test cases. Each input test case consists of a single line containing only the characters (, ), [, and ]; each input test will have length between 1 and 100, inclusive. The end-of-file is marked by a line containing the word “end” and should not be processed.

    Output

    For each input case, the program should print the length of the longest possible regular brackets subsequence on a single line.

    Sample Input

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

    Sample Output

    6
    6
    4
    0
    6
    
    解题思路:题目的意思是在输入的字符串中寻找有多少对括号匹配,并输出它们的个数。需要注意的是,这个问题不能用顺序解决,因为这是两种括号的匹配问题,会出现交叉情况,之前也用过的队列解决过。
    程序代码:

    #include <stdio.h> 
    #include <string.h> 
    #include <algorithm> 
    using namespace std; 

    int max(int x,int y)
    {
     if(x>y) return x;
     else return y;
    }

    int check(char a,char b) 

        if(a=='(' && b==')') 
            return 1; 
        if(a=='[' && b==']') 
            return 1; 
        return 0; 

     
    int main() 

        char str[105]; 
        int dp[105][105],i,j,k,len; 
        while(scanf("%s",str)) 
        { 
            if(!strcmp(str,"end")) 
                break; 
            len = strlen(str); 
            for(i = 0; i<len; i++) 
            { 
                dp[i][i] = 0;
                if(check(str[i],str[i+1])) 
      dp[i][i+1] = 2;
                else 
       dp[i][i+1] = 0;
            } 
            for(k = 3; k<=len; k++) 
            {
                for(i = 0; i+k-1<len; i++) 
                { 
       dp[i][i+k-1] = 0;
                    if(check(str[i],str[i+k-1])) 
         dp[i][i+k-1] = dp[i+1][i+k-2]+2;
                    for(j = i; j<i+k-1; j++) 
        
         dp[i][i+k-1] = max(dp[i][i+k-1],dp[i][j]+dp[j+1][i+k-1]);
                } 
            } 
            printf("%d ",dp[0][len-1]); 
        } 
     
        return 0; 
    }

  • 相关阅读:
    linux权限补充:rwt rwT rws rwS 特殊权限
    关于Linux操作系统下文件特殊权限的解释
    Java学习笔记——Java程序运行超时后退出或进行其他操作的实现
    Java实现 蓝桥杯 算法提高 判断名次
    Java实现 蓝桥杯 算法提高 判断名次
    Java实现 蓝桥杯 算法提高 日期计算
    Java实现 蓝桥杯 算法提高 日期计算
    Java实现 蓝桥杯 算法提高 概率计算
    Java实现 蓝桥杯 算法提高 概率计算
    Java实现 蓝桥杯 算法提高 复数四则运算
  • 原文地址:https://www.cnblogs.com/chenchunhui/p/4725434.html
Copyright © 2011-2022 走看看