UVa 1626 (输出方案) Brackets sequence
生活随笔
收集整理的這篇文章主要介紹了
UVa 1626 (输出方案) Brackets sequence
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
正規(guī)括號序列定義為:
- 空序列是正規(guī)括號序列
- 如果S是正規(guī)括號序列,那么[S]和(S)也是正規(guī)括號序列
- 如果A和B都是正規(guī)括號序列,則AB也是正規(guī)括號序列
輸入一個括號序列,添加盡量少的括號使之成為正規(guī)括號序列,并輸出最優(yōu)方案,多解的話輸出任意一個即可。
設(shè)d(i, j)表示字符串s[i]~s[j]至少添加的括號的數(shù)量,則轉(zhuǎn)移如下:
- S形如[S']或(S'),則轉(zhuǎn)移到d(i+1, j-1)
- 如果S至少有兩個字符,將其分為AB,轉(zhuǎn)移到min{d(i, j), d(A) + d(B)}
不管是否滿足第一條都要嘗試第二種轉(zhuǎn)移,因為[][]可能經(jīng)過第一條轉(zhuǎn)移到][
?
打印的時候重新檢查一下最優(yōu)決策。
1 //#define LOCAL 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 7 const int maxn = 110; 8 char s[maxn]; 9 int d[maxn][maxn], n; 10 11 bool match(char a, char b) 12 { 13 return (a == '(' && b == ')') || (a == '[' && b == ']'); 14 } 15 16 void dp() 17 { 18 for (int i = 0; i < n; ++i) 19 { 20 d[i+1][i] = 0; //對應(yīng)空串 21 d[i][i] = 1; 22 } 23 for (int i = n-2; i >= 0; --i) 24 { 25 for (int j = i+1; j < n; ++j) 26 { 27 d[i][j] = n; 28 if(match(s[i], s[j])) 29 d[i][j] = min(d[i][j], d[i+1][j-1]); 30 for (int k = i; k < j; ++k) 31 d[i][j] = min(d[i][j], d[i][k] + d[k+1][j]); 32 } 33 } 34 } 35 36 void print(int i, int j) 37 { 38 if(i > j) return; 39 if(i == j) 40 { 41 if(s[i] == '(' || s[i] == ')') printf("()"); 42 else printf("[]"); 43 return; 44 } 45 int ans = d[i][j]; 46 if(match(s[i], s[j]) && ans == d[i+1][j-1]) 47 { 48 printf("%c", s[i]); 49 print(i+1, j-1); 50 printf("%c", s[j]); 51 return; 52 } 53 for (int k = i; k < j; ++k) 54 { 55 if(ans == d[i][k] + d[k+1][j]) 56 { 57 print(i, k); 58 print(k+1, j); 59 return; 60 } 61 } 62 } 63 64 void readline(char* s) 65 { 66 fgets(s, maxn, stdin); 67 } 68 69 int main(void) 70 { 71 #ifdef LOCAL 72 freopen("1626in.txt", "r", stdin); 73 #endif 74 75 int T; 76 readline(s); 77 sscanf(s, "%d", &T); 78 readline(s); 79 while(T--) 80 { 81 readline(s); 82 n = strlen(s) - 1; //去掉最后的換行符 83 memset(d, -1, sizeof(d)); 84 dp(); 85 print(0, n-1); 86 puts(""); 87 if(T) puts(""); 88 readline(s); 89 } 90 91 return 0; 92 } 代碼君?
轉(zhuǎn)載于:https://www.cnblogs.com/AOQNRMGYXLMV/p/4009203.html
總結(jié)
以上是生活随笔為你收集整理的UVa 1626 (输出方案) Brackets sequence的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一款基于jquery带百分比的响应式进度
- 下一篇: JAVA常见错误处理方法 和 JVM内存