您的位置:首页 > 其它

【区间dp】POJ 2955 Brackets

2016-11-05 11:53 344 查看
/*
date: 2016/11/5
writer: CN_swords

题意:
给你一个字符串,寻找最长的匹配串的长度。
题解:
定义:dp[i][j] 代表区间(i,j)最长匹配串的长度; 初始化: dp[i][j] = 0;
对于dp[i][j],在(i+1,j)区间如果没找到与i匹配的字符,dp[i][j] = dp[i+1][j];
在(i+1,j)区间如果找到与i匹配的字符,位置为k,那么dp[i][j] = dp[i+1][k-1]+dp[k+1][j]+2;

*/

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 105;

char s
;
int dp[N][N];
bool pan(char a,char b)
{
if(a == '(' && b == ')')
return 1;
if(a == '[' && b == ']')
return 1;
return 0;
}
int main()
{
while(~scanf("%s",s))
{
if(strcmp(s,"end") == 0)
break;
int slen = strlen(s);
memset(dp,0,sizeof(dp));
for(int len = 1; len < slen; len++)
{
for(int i = 0; i+len < slen; i++)
{
int l = i, r = i+len;
dp[l][r] = dp[l+1][r];
for(int k = l+1; k <= r; k++)
{
if(pan(s[i],s[k]))
dp[l][r] = max(dp[l][r],((k-l>=3)?dp[l+1][k-1]:0)+dp[k+1][r]+2);
}
}
}
printf("%d\n",dp[0][slen-1]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: