当前区间f(i, j)分两种情况,一种是s[i]于s[j]符合要求,那么可以转移到f[i + 1][j - 1] 这样答案只会更小或者相等

第二种是直接分成两个部分, 即f[i][j] = f[i][k] + f[k + 1][j],这个时候要取min

同时要注意第一种情况未必是最优的,要从一二两种情况里面取最优值

然后输出方面,按照答案反推,如果当前状态刚好等于其中一种情况,那么就递归下去,边界是

一个字符的时候输出两个字符。

另外学会用fgets,不用gets。fgets头文件cstdio, fgets(s, MAXN, stdin);

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #define REP(i, a, b) for(int i = (a); i < (b); i++)
  5. using namespace std;
  6. const int MAXN = 112;
  7. char s[MAXN];
  8. int f[MAXN][MAXN], n;
  9. inline bool match(char a, char b)
  10. {
  11. return (a == '(' && b == ')') || (a == '[' && b == ']');
  12. }
  13. void work()
  14. {
  15. REP(i, 0, n)
  16. {
  17. f[i + 1][i] = 0;
  18. f[i][i] = 1;
  19. }
  20. for(int i = n - 1; i >= 0; i--)
  21. REP(j, i + 1, n)
  22. {
  23. f[i][j] = n;
  24. if(match(s[i], s[j])) f[i][j] = f[i + 1][j - 1];
  25. REP(k, i, j)
  26. f[i][j] = min(f[i][j], f[i][k] + f[k + 1][j]);
  27. }
  28. }
  29. void print(int i, int j)
  30. {
  31. if(i > j) return;
  32. if(i == j)
  33. {
  34. if(s[i] == '(' || s[i] == ')') printf("()");
  35. else printf("[]");
  36. return;
  37. }
  38. int ans = f[i][j];
  39. if(match(s[i], s[j]) && ans == f[i + 1][j - 1])
  40. {
  41. putchar(s[i]);
  42. print(i + 1, j - 1);
  43. putchar(s[j]);
  44. return;
  45. }
  46. REP(k, i, j)
  47. if(ans == f[i][k] + f[k + 1][j])
  48. {
  49. print(i, k); print(k + 1, j);
  50. return;
  51. }
  52. }
  53. void read(char* s)
  54. {
  55. fgets(s, MAXN, stdin);
  56. }
  57. int main()
  58. {
  59. int T;
  60. scanf("%d", &T);
  61. read(s); read(s);
  62. while(T--)
  63. {
  64. read(s);
  65. n = strlen(s) - 1;
  66. work();
  67. print(0, n -1);
  68. puts("");
  69. if(T) puts("");
  70. read(s);
  71. }
  72. return 0;
  73. }

紫书 例题 9-10 UVa 1626 (区间dp + 输出技巧)的更多相关文章

  1. UVA 1626 区间dp、打印路径

    uva 紫书例题,这个区间dp最容易错的应该是(S)这种匹配情况,如果不是题目中给了提示我就忽略了,只想着左右分割忘记了这种特殊的例子. dp[i][j]=MIN{dp[i+1][j-1] | if( ...

  2. 紫书 例题 11-13 UVa 10735(混合图的欧拉回路)(最大流)

    这道题写了两个多小时-- 首先讲一下怎么建模 我们的目的是让所有点的出度等于入度 那么我们可以把点分为两部分, 一部分出度大于入度, 一部分入度大于出度 那么显然, 按照书里的思路,将边方向后,就相当 ...

  3. 紫书 例题 9-9 UVa 10003 (区间dp+递推顺序)

    区间dp,可以以一个区间为状态,f[i][j]是第i个切点到第j个切点的木棍的最小费用 那么对于当前这一个区间,枚举切点k, 可以得出f[i][j] = min{dp(i, k) + dp(k, j) ...

  4. 紫书 例题8-4 UVa 11134(问题分解 + 贪心)

     这道题目可以把问题分解, 因为x坐标和y坐标的答案之间没有联系, 所以可以单独求两个坐标的答案 我一开始想的是按照左区间从小到大, 相同的时候从右区间从小到大排序, 然后WA 去uDebug找了数据 ...

  5. 紫书 例题 9-5 UVa 12563 ( 01背包变形)

    总的来说就是价值为1,时间因物品而变,同时注意要刚好取到的01背包 (1)时间方面.按照题意,每首歌的时间最多为t + w - 1,这里要注意. 同时记得最后要加入时间为678的一首歌曲 (2)这里因 ...

  6. 紫书 例题8-3 UVa 1152(中途相遇法)

    这道题要逆向思维, 就是求出答案的一部分, 然后反过去去寻找答案存不存在. 其实很多其他题都用了这道题目的方法, 自己以前都没有发现, 这道题专门考这个方法.这个方法可以没有一直往下求, 可以省去很多 ...

  7. 紫书 例题8-12 UVa 12627 (找规律 + 递归)

    紫书上有很明显的笔误, 公式写错了.g(k, i)的那个公式应该加上c(k-1)而不是c(k).如果加上c(k-1)那就是这一次 所有的红气球的数目, 肯定大于最下面i行的红气球数 我用的是f的公式, ...

  8. 紫书 例题8-17 UVa 1609 (构造法)(详细注释)

    这道题用构造法, 就是自己依据题目想出一种可以得到解的方法, 没有什么规律可言, 只能根据题目本身来思考. 这道题的构造法比较复杂, 不知道刘汝佳是怎么想出来的, 我想的话肯定想不到. 具体思路紫书上 ...

  9. BZOJ 1260&UVa 4394 区间DP

    题意: 给一段字符串成段染色,问染成目标串最少次数. SOL: 区间DP... DP[i][j]表示从i染到j最小代价 转移:dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k ...

随机推荐

  1. win7休眠的开启与关闭方法命令行操作和图文结合的鼠标操作

    win7休眠的开启与关闭方法 从開始菜单中找到"附件→命令提示符",手工输入例如以下命令:powercfg -a.从这里能够清楚的看到,计算机是支持休眠的.显示"尚未启用 ...

  2. 6、python中的字符串

    最早的编码为ascii码,共256个符号.UTF-8是国际通用编码,全面支持中文,以一个字节表示英文,以三个字节表示一个中文以及其他语言:GB2312是我国自己定制的中文编码标准,使用1个字节表示英文 ...

  3. Data Member Order

    https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/data-member-order In some appl ...

  4. Nginx服务器的反向代理proxy_pass配置方法讲解

    Nginx的配置还是比较简单的,如:   1 2 3 4 location ~ /* { proxy_pass http://127.0.0.1:8008; } 或者可以   1 2 3 4 loca ...

  5. Traversing a list

    The most common way to traverse the elements of a list is with a for loop. The syntax is the same as ...

  6. spring boot自动配置之jdbc

    1.DataSource配置 1.1 默认配置application.xml spring.datasource.url=jdbc:mysql://localhost/test spring.data ...

  7. Win32++:可替代MFC的Windows桌面应用开发框架

    写在前面 有过Win32编程经验的朋友都知道,使用Windows提供的API开发桌面应用是相当繁琐的,创建一个功能简单能接收并处理消息的窗口至少也得几百行代码.创建一个可视化的窗口一般要以下几个步骤: ...

  8. JavaScript中函数作为另一个函数的参数的时候它存在于哪个作用域

    一直对函数作为参数被传递进另外一个函数理解的不是很清除.先看下这段代码吧: function test(fn){ var bar = 1; fn(); } var bar = 99; test(fun ...

  9. 高德地图和canvas画图结合应用(二)

    上节讲述了如在在高德地图中添加canvas图层,这节就讲述下如何在canvas图层添加鼠标的事件. 在上节脚本的最后加入以下代码: var text; $('#container').on('clic ...

  10. 加载等待loading

    自己写的一个小插件,还有很多需要完善... (function ($) {    $.fn.StartLoading = function (option) {        var defaultV ...