其他分享
首页 > 其他分享> > POJ2955 Brackets

POJ2955 Brackets

作者:互联网

POJ2955 Brackets 题目链接:https://vjudge.net/problem/POJ-2955   题意:求最长的合法括号子序列长度   思路: 基础的区间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\n",f[1][n]);
    }
    return 0; 
}

 

标签:10,Brackets,int,len,POJ2955,区间,100,include
来源: https://www.cnblogs.com/chillilly/p/12781853.html