poj2955(区间dp,括号匹配)

解题思路:

状态转移方程为

dp[i][j]表示第i位和第j位字符间匹配数

当s[i]匹配s[j]时 dp[i][j]=dp[i+1][j-1]+2

然后 还有一部不论匹不匹配,都要

dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j])

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int dp[105][105];
char s[105];
bool mtch(char c1,char c2)
{
	if(c1=='('&&c2==')') return true;
	if(c1=='['&&c2==']') return true;
	return false;
}
void solve()
{
	memset(dp,0,sizeof(dp));
	int l=strlen(s);
	for(int d=1;d<l;d++)
	{
		for(int i=0;i+d<l;i++)
		{
			int j=i+d;
			if(mtch(s[i],s[j])) 
			{
				dp[i][j]=dp[i+1][j-1]+2;
			}
			for(int k=i;k<=j-1;k++)
			dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]);
		}
	}
}
int main()
{
	//freopen("t.txt","r",stdin);
	while(1)
	{
		scanf("%s",s);
		if(s[0]=='e') break;
		solve();
		printf("%d\n",dp[0][strlen(s)-1]); 
	}
	return 0;
} 

 

    原文作者:括号匹配问题
    原文地址: https://blog.csdn.net/qq_39861441/article/details/88657790
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞