poj 2955 Brackets(区间dp)

来源:互联网 发布:python range to list 编辑:程序博客网 时间:2024/06/16 23:46

题目链接:poj2955

题目大意:给出一个字符串,进行括号的匹配。 (和),[和],两对括号,问一个字符串中最对有几个括号是互相匹配的

思路:简单的区间dp问题  o(n^3)的复杂的

第一层循环枚举区间的长度,第二层循环是这个区间的起始点,第三个循环是这个区间的内的间断点。

#include<iostream>#include<iostream>#include<cstring>#include<string.h>#include<algorithm>#include<cstdio>using namespace std;#define maxn 200char s[maxn];int dp[maxn][maxn];int getmatch(int i,int j){if((s[i]=='('&&s[j]==')')||(s[i]=='['&&s[j]==']'))return 2;else return 0;}void solve(int len){memset(dp,0,sizeof dp);for(int i=0;i<len-1;i++)dp[i][i+1]=getmatch(i,i+1);for(int d=2;d<len;d++){for(int i=0,j;(j=i+d)<len;i++){dp[i][j]=dp[i+1][j-1]+getmatch(i,j);for(int k=i;k<j;k++){dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]);}}}}int main(){while(~scanf("%s",s)){if(s[0]=='e')break;int len=strlen(s);solve(len);printf("%d\n",dp[0][len-1]);}return 0;}