Brackets POJ -2955 Brackets matching interval dp Winter vacation training

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 This is the
second time to write this question, for the interval dp To understand better, the maximum value of the two intervals can be combined by setting the segment points for the interval dp

#include<map>
#include<stack>
#include<queue>
#include<string>
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#define ls (k<<1)
#define rs (k<<1|1)
#define pb push_back
#define mid ((l+r)>>1)
using namespace std;
const int p=1e4+7;
const int mod=1e9+7;
const int maxn=200;
typedef long long ll;
const int inf=0x3f3f3f3f;   
int dp[maxn][maxn];
char s[maxn];
void solve(){
    
    
    while(scanf("%s",s+1)!=EOF){
    
    
        if(s[1]=='e') break;
        memset(dp,0,sizeof(dp));
        int len=strlen(s+1);
        for(int i=1;i<=len;i++){
    
    //枚举字符串长度
            for(int j=1;j+i<=len+1;j++){
    
    //枚举端点
                int k=i+j-1;//
                if(s[j]=='('&&s[k]==')')
                    dp[j][k]=dp[j+1][k-1]+2;//(p)
                else if(s[j]=='['&&s[k]==']')
                    dp[j][k]=dp[j+1][k-1]+2;
                for(int x=j;x<k;x++)//枚举区域中的分端点
                    dp[j][k]=max(dp[j][k],dp[j][x]+dp[x+1][k]);//()()()
            }   
        }
        cout<<dp[1][len]<<endl;
    }
}
int main(){
    
    
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    solve();
    return 0;
}

Guess you like

Origin blog.csdn.net/qq_45891413/article/details/112740988