题目链接:
http://poj.org/problem?id=2955
题意:
一个区间内最长的匹配的括号的最大长度
分析:
我们设DP[i][j]表示从i,到j 的最长的匹配的括号的长度,
如果i-1与j+1是匹配的话 那么 DP[i-1][J+1]=DP[i][j]+2;
DP[i][j]=max{DP[i][j],dp[i][k]+dp[k+1][j]};
代码如下:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn = 110;
int dp[maxn][maxn];
char a[maxn];
bool judge(int i,int j)
{
if(a[i]=='('&&a[j]==')'||a[i]=='['&&a[j]==']')
return true;
return false;
}
int main()
{
while(~scanf("%s",a)){
if(strcmp(a,"end")==0) break;
int len=strlen(a);
memset(dp,0,sizeof(dp));
for(int i=2;i<=len;i++){//枚举长度
for(int j=0;j+i-1<len;j++){//枚举起点
int e = j+i-1;
if(judge(j,e)) dp[j][e]=dp[j+1][e-1]+2;
for(int k=j;k<e;k++)
dp[j][e]=max(dp[j][k]+dp[k+1][e],dp[j][e]);
}
}
printf("%d\n",dp[0][len-1]);
}
return 0;
}
原文:http://blog.csdn.net/bigbigship/article/details/41483255