POJ 2955 Brackets (区间dp入门)

题意:
求一字符串括号序列的最大匹配个数。


思路:
定义dp[i][j]dp[i][j]为从i到j的最大匹配个数,若str[i]和str[j]相匹配,则dp[i][j]=dp[i+1][j1]+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]);
	}
}



猜你喜欢

转载自blog.csdn.net/running_acmer/article/details/80590692