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