#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int check(char a, char b) {
if(a == '(' && b == ')')
return 1;
if(a == '[' && b == ']')
return 1;
return 0;
}
int main() {
//freopen("data.in", "r", stdin);
char str[105];
int dp[105][105], i, j, l, k, len;
while(~scanf("%s", str)) {
if(!strcmp(str, "end"))
break;
memset(dp, 0, sizeof(dp));
len = strlen(str);
//处理长度为1 2的区间
for(int i = 0; i < len - 1; i++)
dp[i][i] = 0;
for(i = 0; i < len - 1; i++) {
if(check(str[i], str[i+1]))
dp[i][i+1] = 2;
else
dp[i][i+1] = 0;
}
for(l = 3; l <= len; l++) {
for(i = 0; i+l-1 < len; i++) {
int j = i+l-1;
dp[i][j] = dp[i+1][j-1];
if(check(str[i], str[j]))
dp[i][j] = dp[i+1][j-1] + 2;
for(k = i; k < j; k++)//k从i枚举,这样才能从长度1来切分
dp[i][j] = max(dp[i][j], dp[i][k] + dp[k+1][j]);
}
}
printf("%d\n",dp[0][len-1]);
}
return 0;
}
POJ2955:Brackets(区间DP)
猜你喜欢
转载自blog.csdn.net/ccshijtgc/article/details/80989602
今日推荐
周排行