POJ 2955

做Uva1626时顺手做这道题,思路一致,Uva那道和之前的一道POJ一样的题,但是不知道怎么,一直有问题,直接拿汝佳老师的方法,自己测有问题,但是那上面反而AC了,就很玄学...

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

const int maxn= 105;

char br[maxn];
int dp[maxn][maxn];

void Init(int n)
{
	memset(dp, 0xf0, sizeof(dp));
	for (int i= 1; i<= n; ++i){
		dp[i][i-1]= dp[i][i]= 0;
	}
}
inline int Match(int l, int r)
{
	if (('('== br[l] && ')'== br[r])
		|| ('['== br[l] && ']'== br[r])){
		return 1;
	}
	return 0;
}

int main()
{
	while (1){
		scanf(" %s", br+1);
		if (!strncmp(br+1, "end", 3))
			break;
		int n= strlen(br+1);

		Init(n);

		for (int d= 1; d< n; ++d){
			int ub= n-d;
			for (int i= 1; i<= ub; ++i){
				int j= i+d;
				if (Match(i, j)){
					dp[i][j]= max(dp[i][j], dp[i+1][j-1]+2);
				}
				for (int k= i; k< j; ++k){
					dp[i][j]= max(dp[i][j], dp[i][k]+dp[k+1][j]);
				}
			}
		}
		cout<<dp[1][n]<<endl;
	}
	return 0;
}
原文地址:https://www.cnblogs.com/Idi0t-N3/p/14146671.html