1033.Brackets sequence
#include <cstdio>
#include <cstdlib>
#include <iostream>
#define inf 0x3fffffff
using namespace std;
int f[101][101];
int p[101][101];
char s[102];
void dyna(int n) {
int i, j, k, l, t;
for (i = 1; i <= n; i++)
f[i][i] = 1;
for (l = 2; l <= n; l++) {
for (i = 1; i <= n - l + 1; i++) {
j = i + l - 1;
f[i][j] = inf;
p[i][j] = -1;
if (s[i] == '(' && s[j] == ')' || s[i] == '[' && s[j] == ']')
f[i][j] = f[i + 1][j - 1];
for (k = i; k < j; k++) {
t = f[i][k] + f[k + 1][j];
if (t < f[i][j]) {
f[i][j] = t;
p[i][j] = k;
}
}
}
}
}
void recur(int beg, int end) {
if (beg > end)
return;
if (beg == end) {
if (s[beg] == '(' || s[beg] == ')')
printf("()");
else
printf("[]");
} else {
if (p[beg][end] == -1) {
printf("%c", s[beg]);
recur(beg + 1, end - 1);
printf("%c", s[end]);
} else {
recur(beg, p[beg][end]);
recur(p[beg][end] + 1, end);
}
}
}
int main(int argc, char* argv[]) {
int n;
scanf("%s", s + 1);
n = strlen(s + 1);
dyna(n);
recur(1, n);
printf("\n");
return 0;
}
|
作者: gzzcracker
发布时间: 2010-11-10