POJ2955 Brackets

Posted chillilly

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ2955 Brackets相关的知识,希望对你有一定的参考价值。

POJ2955 Brackets
 
题意:求最长的合法括号子序列长度
 
思路:
基础的区间DP问题。用f[i][j]表示第i到第j区间内的最长合法括号子序列长度。
首先要进行预处理:
如果当前区间 [l,r] 的左端点和右端点构成合法括号序列,那么将该区间的子序列长度预处理为f[l+1][r-1]+2;
状态转移方程:
f[i][j]=max(f[i][k]+f[k+1][j],f[i][j])
从外到内依次枚举区间长度len,区间左端点l,以及中间节点k
算法的复杂度是O(n^3)
 
AC代码:
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int f[100+10][100+10];
char s[100+10];

int main()
{
    while(scanf("%s",s+1)&&s[1]!=e){
        memset(f,0,sizeof(f));
        int n=strlen(s+1);
        for (int len=2;len<=n;len++){
            for (int l=1;l<=n-len+1;l++){
                int r=l+len-1;
                if (s[r]==)&&s[l]==() f[l][r]=f[l+1][r-1]+2;
                if (s[r]==]&&s[l]==[) f[l][r]=f[l+1][r-1]+2;
                for (int k=l;k<r;k++){
                    f[l][r]=max(f[l][k]+f[k+1][r],f[l][r]);
                }
            }
        }
        printf("%d
",f[1][n]);
    }
    return 0; 
}

 

以上是关于POJ2955 Brackets的主要内容,如果未能解决你的问题,请参考以下文章

POJ2955 Brackets

POJ 2955 - Brackets - [区间DP]

Brackets POJ - 2955 (区间dp)

POJ 2955 Brackets(区间DP)题解

POJ 2955 Brackets

POJ 2955?Brackets