标签:
http://poj.org/problem?id=2955
给出一个只由‘(‘、‘)‘、‘[‘、‘]‘构成的字符串,字符间可以匹配,左边的 ‘(‘ 可以与右边的 ‘)‘ 匹配,左边的 ‘[‘ 可以与右边的 ‘]‘ 匹配
两种匹配不能交叉,可以包含,如 [(])只算2个匹配而[()]算四个匹配,求最大匹配数。
设dp[i][j]为区间 i 到 j (设len为区间长度,j=i+len)内可以得到的最大匹配数,则有两种情况:
① j 不与区间[i,j]内的任意一个字符匹配 dp[i][j]=dp[i][j-1]
② 可以在区间[i,j]内找到一个点k使得 k 上的字符可以与 j 上的字符匹配,此时dp[i][j]=max(dp[i][j],dp[i][k-1]+dp[k+1][j-1]+2)
#include<stdio.h>
#include<string.h>
const int N=110;
int dp[N][N];
char s[N];
int mmax(int x,int y)
{
return x>y?x:y;
}
char Get_c(char c)
{
if(c==‘)‘)return ‘(‘;
if(c==‘]‘)return ‘[‘;
return ‘!‘;
}
void solve()
{
memset(dp,0,sizeof(dp));
while(~scanf("%s",s+1)&&s[1]!=‘e‘)
{
s[0]=‘?‘;
int t=strlen(s);
for(int len=1;len<t;++len)
for(int i=1;i+len<=t;++i)
{
int j=i+len;
char c=Get_c(s[j]);
dp[i][j]=dp[i][j-1];
for(int k=i;k<j;++k)
if(s[k]==c)
{
dp[i][j]=mmax(dp[i][j],dp[i][k-1]+dp[k+1][j-1]+2);
}
}
printf("%d\n",dp[1][t]);
}
}
int main()
{
solve();
return 0;
}
标签:
原文地址:http://www.cnblogs.com/kiuhghcsc/p/5746399.html