标签:
Time Limit: 1000MS | Memory Limit: 65536K | |||
Total Submissions: 27996 | Accepted: 7936 | Special Judge |
Description
Input
Output
Sample Input
([(]
Sample Output
()[()]
Source
#include <cstdio> #include <cstring> using namespace std; char s[105]; int n, f[105][105], p[105][105]; void print(int l, int r) { if (l > r) return; if (p[l][r] == -1) { printf("%c", s[l]); print(l + 1, r - 1); printf("%c", s[r]); return; } if (p[l][r] == -2) { printf("%c", s[l]); print(l + 1, r); if (s[l] == ‘(‘) printf(")"); else printf("]"); return; } if (p[l][r] == -3) { if (s[r] == ‘)‘) printf("("); else printf("["); print(l, r - 1); printf("%c", s[r]); return; } print(l, p[l][r] - 1); print(p[l][r], r); } int main() { fgets(s, 104, stdin); n = strlen(s) - 1; memset(f, 0x7f, sizeof(f)); memset(p, 0, sizeof(p)); for (int i = 0; i < n; ++i) { f[i][i] = 1; if (s[i] == ‘(‘ || s[i] == ‘[‘) p[i][i] = -2; else p[i][i] = -3; for (int j = 0; j < i; ++j) f[i][j] = 0; } for (int i = n - 1; i >= 0; --i) for (int j = i + 1; j < n; ++j) { if ((s[i] == ‘(‘ || s[j] == ‘[‘) && f[i][j] > f[i + 1][j] + 1) { f[i][j] = f[i + 1][j] + 1; p[i][j] = -2; } if ((s[j] == ‘)‘ || s[j] == ‘]‘) && f[i][j] > f[i][j - 1] + 1) { f[i][j] = f[i][j - 1] + 1; p[i][j] = -3; } if (((s[i] == ‘(‘ && s[j] == ‘)‘) || (s[i] == ‘[‘ && s[j] == ‘]‘)) && f[i][j] > f[i + 1][j - 1]) { f[i][j] = f[i + 1][j - 1]; p[i][j] = -1; } for (int k = i + 1; k <= j; ++k) if (f[i][j] >= f[i][k - 1] + f[k][j]) { f[i][j] = f[i][k - 1] + f[k][j]; p[i][j] = k; } } print(0, n - 1); printf("\n"); return 0; }
标签:
原文地址:http://www.cnblogs.com/albert7xie/p/4905949.html