UVA1626BracketsSequence

来源:互联网 发布:广州金针软件电话 编辑:程序博客网 时间:2024/05/22 12:35
//UVA1626BracketsSequence#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int MAXN = 100 + 10;char s[MAXN];int d[MAXN][MAXN];int len;inline bool Match(int a, int b) {return (a == '(' && b == ')') || (a == '[' && b == ']');}void dp() {for(int i = 0; i < len; i++) {d[i][i] = 1;d[i + 1][i] = 0;}//递推终止条件 for(int i = len - 2; i >= 0; i--) {for(int j = i + 1; j < len; j++) {d[i][j] = len;if(Match(s[i], s[j])) {d[i][j] = min(d[i][j], d[i + 1][j - 1]);}for(int k = i; k < j; k++) {d[i][j] = min(d[i][k] + d[k + 1][j], d[i][j]);}}}}void print(int i, int j) {if(i > j) return ;if(i == j) {if(s[i] == '(' || s[i] == ')') printf("()"); else printf("[]"); return ;}int ans = d[i][j];if(Match(s[i], s[j]) && ans == d[i + 1][j - 1]) {printf("%c", s[i]); print(i + 1, j - 1); printf("%c", s[j]);return ;}for(int k = i; k < j; k++) {if(d[i][k] + d[k + 1][j] == ans) {print(i, k); print(k + 1, j); return ;}}}int main() {int kase;//freopen("UVA1626out.txt", "w", stdout);scanf("%d\n", &kase);for(int i = 0; i < kase; i++) {if(i) printf("\n");fgets(s, sizeof(s), stdin);getchar();len = strlen(s) - 1;//fgets会读入换行符 dp();print(0, len - 1);printf("\n");}return 0;} /*2([(]*/

原创粉丝点击