zoukankan      html  css  js  c++  java
  • POJ2955Brackets[区间DP]

    Brackets
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 6585   Accepted: 3534

    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 i1i2, …, im where 1 ≤ i1 < i2 < … < im ≤ nai1ai2 … 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

    Source


    题意:求最大括号匹配

    f[i][j]表示i到j的最大括号匹配
    两种转移
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    const int N=105;
    char s[N];
    int f[N][N];
    inline bool check(int i,int j){
        if(s[i]=='['&&s[j]==']') return 1;
        if(s[i]=='('&&s[j]==')') return 1;
        return 0;
    }
    int main(){
        while(~scanf("%s",s+1)){
            if(s[1]=='e') break;
            memset(f,0,sizeof(f));
            int n=strlen(s+1);
            for(int i=n;i>=1;i--)
                for(int j=i+1;j<=n;j++){
                    if(check(i,j)) f[i][j]=f[i+1][j-1]+2;
                    for(int k=i;k<=j;k++) f[i][j]=max(f[i][j],f[i][k]+f[k][j]); 
                }
            printf("%d
    ",f[1][n]);        
        }
    }
  • 相关阅读:
    permission 文档 翻译 运行时权限
    TabLayout ViewPager Fragment 简介 案例 MD
    Log 日志工具类 保存到文件 MD
    OkHttp 官方wiki 翻译 MD
    Okhttp 简介 示例 MD
    OkHttp 官方Wiki之【使用案例】
    DialogPlus
    倒计时 总结 Timer Handler CountDownTimer RxJava MD
    RecyclerView 判断滑到底部 顶部 预加载 更多 分页 MD
    CSS3的媒体查询(Media Queries)与移动设备显示尺寸大全
  • 原文地址:https://www.cnblogs.com/candy99/p/5923715.html
Copyright © 2011-2022 走看看