来源:POJ2955
自己要想清楚才能学的好,真话
转移方程:
如果匹配
dp[i][j] = dp[i+1][j-1] + 2;
然后整合
dp[i][j] = max(dp[i][j] , dp[i][k]+dp[k+1][j]);
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 110;
char x[MAXN];
int dp[MAXN][MAXN];
int main(){
while(scanf("%s",x+1)!=EOF){
//cout<<x+1<<endl;
if(x[1]=='e') break;
int len = strlen(x+1);
//cout<<"len = "<<len<<endl;
memset(dp,0,sizeof(dp));
for(int l=2;l<=len;l++){
for(int i=1;i<=len-l+1;i++){
int j=i+l-1;
//cout<<i<<" "<<j<<" "<<l<<endl;
if((x[i]=='('&&x[j]==')')||(x[i]=='['&&x[j]==']')){
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][len]<<endl;
}
return 0;
}