zoukankan      html  css  js  c++  java
  • POJ-2955括号匹配问题(区间DP)

    Brackets
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 4834   Accepted: 2574

    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

    Difficulty: (1).状态:dp[i][j]为i~j的最大括号数。

    (2). 转移:考虑第i个括号,有两种情况:

    1.i无效,直接算dp[i + 1][j];

    2.找到和i匹配的右括号k,分两边算并加起来。dp[i][j] = dp[i+1][k-1] + 2 + dp[k + 1][j]
    感想:记忆化搜索实质上就是暴力枚举。
    #include <cstdio>
    #include <iostream>
    #include <cstdlib>
    #include <algorithm>
    #include <ctime>
    #include <cmath>
    #include <string>
    #include <cstring>
    #include <stack>
    #include <queue>
    #include <list>
    #include <vector>
    #include <map>
    #include <set>
    using namespace std;
    
    const int INF=0x3f3f3f3f;
    const double eps=1e-10;
    const double PI=acos(-1.0);
    #define maxn 1100
    
    char a[maxn];
    int dp[maxn][maxn];
    int is(char b, char c)
    {
        if(b == '(' && c == ')' || b == '[' && c == ']')
            return 1;
        else
            return 0;
    
    }
    int dfs(int st, int ed)
    {
        //
        if(st > ed)
            return 0;
        if(st == ed)
           return 0;
        if(dp[st][ed] != -1) return dp[st][ed];
        int res = dfs(st+1, ed);
        for(int k = st+1; k <= ed; k++)
            if(is(a[st],a[k]))
            {
                res = max(res,dfs(st+1,k-1) + 2 + dfs(k+1,ed));
                flag = 1;
            }
            dp[st][ed] = res;
        return dp[st][ed];
    }
    int main()
    {
        while(~scanf("%s", a))
        {
            if(strcmp(a, "end") == 0)
                break;
            memset(dp, -1, sizeof dp);
            int ed = strlen(a)-1;
            printf("%d
    ", dfs(0, ed));
        }
        return 0;
    }
     
  • 相关阅读:
    Python循环语句
    Python简单的语句组
    Jedis 之 初始<一>
    微信小程序登入流程
    微信小程序发起请求
    django数据库迁移时候异常
    Git常用命令总结
    微信小程序自定义组件
    POJ3345 Bribing FIPA
    POJ1947 Rebuilding Roads
  • 原文地址:https://www.cnblogs.com/ZP-Better/p/5133600.html
Copyright © 2011-2022 走看看