您的位置:首页 > 其它

poj 2955 Brackets

2013-07-16 10:20 344 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: