题意:求括号匹配的最大长度
思路:简单区间dp,令dp[i][j] 为 区间(i,j)之间的最大匹配长度。
这样dp[i][j] = max( dp[i][j] , dp[i][x] + dp[x+1][j] ) i<x<j
不过dp[i][j] 得先初始化,为dp[i+1][j-1] 或者 dp[i+1][j-1] +2 ;
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
int const maxn = 110;
char str[maxn];
int dp[maxn][maxn];
int main()
{
while(scanf("%s",str)!=EOF)
{
if(str[0]=='e')break;
int n = strlen(str);
memset(dp,0,sizeof(dp));
for(int i = 0 ; i < n ; i++)
{//初始化
dp[i][i] = 0 ;
if((str[i]=='('&&str[i+1]==')')||(str[i]=='['&&str[i+1]==']'))
dp[i][i+1] = 2 ;
else dp[i][i+1] = 0 ;
}
for(int k = 2 ; k < n ; k++)
{
for(int i = 0 , j = k ; j < n ; j++ , i++)
{ //每次i和j相隔k个距离
if((str[i]=='('&&str[j]==')')||(str[i]=='['&&str[j]==']')) //匹配
dp[i][j] = dp[i+1][j-1] + 2 ;
for(int x = i ; x < j ; x++) //区间最值合并
{
dp[i][j] = max(dp[i][j],dp[i][x] + dp[x+1][j]);
}
}
}
printf("%d\n",dp[0][n-1]);
}
return 0;
}
/*
Auther:LIUYAN
2015.12.16
((()))
()()()
([]])
)[)(
([][][)
end
*/