您的位置:首页 > 其它

poj 2955 Brackets 【 区间dp 】

2015-08-17 09:12 423 查看
话说这题自己折腾好久还是没有推出转移的公式来啊------------------

只想出了dp[i][j]表示i到j的最大括号匹配的数目--ค(TㅅT)-------------------

后来搜题解看到有两种有一点点不同的做法

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

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

int d[505][505];
char s[505];
int n;

int ok(int x,int y){
if(s[x] == '(' && s[y] == ')') return 2;
if(s[x] == '[' && s[y] == ']') return 2;
return 0;
}

int dp(int x,int y){
int& ans = d[x][y];
if(ans >= 0) return ans;
if(x >= y) {
ans = 0;
return ans;
}
if(y == x+1) {
ans = ok(x,y);
return ans;
}

ans = dp(x+1,y);
for(int k = x;k <= y;k++){
if(ok(x,k))    ans = max(ans,dp(x+1,k-1) + dp(k+1,y) + 2);
//    printf("ans = %d\n",ans);
}
return ans;
}

int main(){
while(scanf("%s",s+1) != EOF){
if(s[1] == 'e') break;
n = strlen(s+1);

memset(d,-1,sizeof(d));

int res = dp(1,n);

//for(int i = 1;i <= n;i++)
//for(int j = 1;j <= n;j++)
// printf("d[%d][%d] = %d\n",i,j,d[i][j]);

printf("%d\n",res);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: