日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

UVa 1626 (输出方案) Brackets sequence

發布時間:2024/8/24 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UVa 1626 (输出方案) Brackets sequence 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正規括號序列定義為:

  • 空序列是正規括號序列
  • 如果S是正規括號序列,那么[S]和(S)也是正規括號序列
  • 如果A和B都是正規括號序列,則AB也是正規括號序列

輸入一個括號序列,添加盡量少的括號使之成為正規括號序列,并輸出最優方案,多解的話輸出任意一個即可。

設d(i, j)表示字符串s[i]~s[j]至少添加的括號的數量,則轉移如下:

  • S形如[S']或(S'),則轉移到d(i+1, j-1)
  • 如果S至少有兩個字符,將其分為AB,轉移到min{d(i, j), d(A) + d(B)}

不管是否滿足第一條都要嘗試第二種轉移,因為[][]可能經過第一條轉移到][

?

打印的時候重新檢查一下最優決策。

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; //對應空串 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 } 代碼君

?

轉載于:https://www.cnblogs.com/AOQNRMGYXLMV/p/4009203.html

總結

以上是生活随笔為你收集整理的UVa 1626 (输出方案) Brackets sequence的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。