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;
}