码迷,mamicode.com
首页 > 其他好文 > 详细

POJ2955 Brackets

时间:2020-04-26 21:05:13      阅读:51      评论:0      收藏:0      [点我收藏+]

标签:space   http   状态转移方程   div   main   ref   int   题目   return   

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\n",f[1][n]);
    }
    return 0; 
}

 

POJ2955 Brackets

标签:space   http   状态转移方程   div   main   ref   int   题目   return   

原文地址:https://www.cnblogs.com/chillilly/p/12781853.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!