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的主要内容,如果未能解决你的问题,请参考以下文章