poj 2955 Brackets

http://poj.org/problem?id=2955
// 求最长合法子序列
// 区间 dp
// dp[i][j] 表示区间 i,j 的最长合法子序列
#include <iostream> #include <algorithm> #include <queue> #include <math.h> #include <stdio.h> #include <string.h> using namespace std; #define MOD 1000000007 #define maxn 110 int dp[maxn][maxn]; char a[110]; bool cmp(char c1 ,char c2){ if(c1=='('&&c2==')') return true; if(c1=='['&&c2==']') return true; return false; } int main() { while(scanf("%s",a)){ if(strcmp(a,"end")==0) break; int i,j,k; int len=strlen(a); for(i=0;i<len;i++) { dp[i][i]=0; if(cmp(a[i],a[i+1])) dp[i][i+1]=2;else dp[i][i+1]=0; } for(k=3;k<=len;k++){ for(i=0;i+k-1<len;i++){ dp[i][i+k-1]=0; if(cmp(a[i],a[i+k-1])) dp[i][i+k-1]=dp[i+1][i+k-2]+2; for(j=i;j<i+k-1;j++) dp[i][i+k-1]=max(dp[i][i+k-1],dp[i][j]+dp[j+1][i+k-1]); } } printf("%d\n",dp[0][len-1]); } return 0; }

 

posted on 2013-07-16 10:20  江财小子  阅读(177)  评论(0编辑  收藏  举报