题意:
求一字符串括号序列的最大匹配个数。
思路:
定义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]);
}
}