题意:
求一字符串括号序列的最大匹配个数。
思路:
定义dp[i][j]dp[i][j]为从i到j的最大匹配个数,若str[i]和str[j]相匹配,则dp[i][j]=dp[i+1][j?1]+2dp[i][j]=dp[i+1][j?1]+2,枚举k为区间i~j的分段点,状态转移方程为: dp[s][e]=max(dp[s][e],dp[s][k]+dp[k+1][e]);
代码:
dp[i][j]=max(dp[i][k],dp[k+1][j]
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=106;
char str[maxn];
int dp[maxn][maxn];
int main(){while(~scanf("%s",str)){memset(dp,0,sizeof(dp));if(str[0]=='e')break;int len=strlen(str);for(int l=2;l<=len;l++){for(int s=0;s<len-l+1;s++){int e=s+l-1;if((str[s]=='('&&str[e]==')')||(str[s]=='['&&str[e]==']')){dp[s][e]=dp[s+1][e-1]+2;}for(int k=s;k<e;k++){dp[s][e]=max(dp[s][e],dp[s][k]+dp[k+1][e]);}}}printf("%d\n",dp[0][len-1]);}
}