题目:poj2955
题意:给出一个只包含(、)、【、】的字符串,求出最长的合格子串的长度
解答:dp[i][j]表示从第i个字符到第j个字符最长的合格子串的长度,由此得出两个转移方程:
dp[i][j] = dp[i+1][j-1] + 2(i和j匹配)
dp[i][j] = max(dp[i][j],dp[i][k]+dp[k+1][j])(i <= k <= j)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
char s[140];
int dp[140][140];
int main()
{
while(~scanf("%s",s))
{
if(s[0] == 'e')
break;
memset(dp,0,sizeof(dp));
int len = strlen(s);
for(int l = 2;l <= len;l++)
for(int i = 0;i < len-1;i++)
{
int j = i + l - 1;
if(j < len){
if((s[i] == '(' && s[j] == ')') || (s[i] == '[' && s[j] == ']'))
{
dp[i][j] = dp[i+1][j-1] + 2;
}
for(int k = i;k <= j;k++)
{
if(k+1 <= j)
dp[i][j] = max(dp[i][j],dp[i][k]+dp[k+1][j]);
}
}
}
printf("%d\n",dp[0][len-1]);
}
return 0;
}