您的位置:首页 > 其它

POJ 2955 Brackets (区间DP 经典括号配对)

2015-07-16 15:14 603 查看
题意略。

思路:

设dp[i][j]为区间i到j的regular brackers的最大长度。

状态转移方程:

如果a[i]和a[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<iostream>

using namespace std;
const int maxn = 105;

char s[maxn];
int n,dp[maxn][maxn];

bool match(int i,int j){
if(s[i] == '[' && s[j] == ']') return true;
if(s[i] == '(' && s[j] == ')') return true;
return false;
}

int main(){
while(~scanf("%s",s)){
if(s[0] == 'e') break;
n = strlen(s);
memset(dp,0,sizeof(dp));
for(int i = n-1 ; i >= 0 ; i--){
for(int j = i; j < n ; j++){
if(match(i,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]);

}
}
printf("%d\n",dp[0][n-1]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: