UVa 1626 (输出方案) Brackets sequence
2014-10-07 12:45
399 查看
正规括号序列定义为:
空序列是正规括号序列
如果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)}
不管是否满足第一条都要尝试第二种转移,因为[][]可能经过第一条转移到][
打印的时候重新检查一下最优决策。
代码君
空序列是正规括号序列
如果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)}
不管是否满足第一条都要尝试第二种转移,因为[][]可能经过第一条转移到][
打印的时候重新检查一下最优决策。
//#define LOCAL #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 110; char s[maxn]; int d[maxn][maxn], n; bool match(char a, char b) { return (a == '(' && b == ')') || (a == '[' && b == ']'); } void dp() { for (int i = 0; i < n; ++i) { d[i+1][i] = 0; //对应空串 d[i][i] = 1; } for (int i = n-2; i >= 0; --i) { for (int j = i+1; j < n; ++j) { d[i][j] = n; 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][j], d[i][k] + d[k+1][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(ans == d[i][k] + d[k+1][j]) { print(i, k); print(k+1, j); return; } } } void readline(char* s) { fgets(s, maxn, stdin); } int main(void) { #ifdef LOCAL freopen("1626in.txt", "r", stdin); #endif int T; readline(s); sscanf(s, "%d", &T); readline(s); while(T--) { readline(s); n = strlen(s) - 1; //去掉最后的换行符 memset(d, -1, sizeof(d)); dp(); print(0, n-1); puts(""); if(T) puts(""); readline(s); } return 0; }
代码君
相关文章推荐
- UVa 11167 Monkeys in the Emei Mountain 最大流,区间模型,输出方案
- UVA 1391 Astronauts(2-SAT + 输出方案)
- UVA-11167 Monkeys in the Emei Mountain(区间模型最大流+输出方案)
- uva 10735 混合图欧拉路径的判定,方案输出。
- 【UVA1378】A Funny Stone Game (博弈-求SG值-输出方案)
- Uva-624 CD (需要输出方案的01背包)
- uva 624 CD (DP + DFS 输出方案)
- UVA 624 CD(01背包+输出方案)
- Uva624 01背包输出方案 xingxing在努力
- UVA 10537 The Toll! Revisited(dijkstra输出字典序最小的路径)
- 一篇干货业务分析方案要提供的几个输出点
- ***uva 348 最优数组乘法序列(记忆化搜索+输出路径)
- UVA1626 Bracketssequence(括号匹配)
- HDU 2177 取(2堆)石子游戏 Wythoff Game+输出方案
- HDOJ2177 [威佐夫博弈](输出方案)
- sgu234 Black-White King Strikes Back(二分图 输出方案)
- The Necklace+uva+求欧拉回路并输出路径
- 八数码之 ①暴力BFS+哈希表版 ②双向BFS+输出最佳方案版
- hdu 1016 dfs+方案输出
- Optimal Array Multiplication Sequence UVA - 348 (最优矩阵链乘+递归输出路径+区间dp)