题目传送门(洛谷)   题目传送门(UVA)


解题思路

很显然是一个区间dp,当然记忆化搜索完全可以AC,这里说一下区间dp。

区间dp的重要特征就是需要枚举中间节点k

看一看这道题,用f[i][j]表示从i...j组成合法序列需要添加括号的个数,

很显然,当s[i]==s[j]时,f[i][j]=f[i+1][j-1],然后枚举中间点k,就能写出动态转移方程:f[i][j]=max(f[i][j],f[i][k]+f[k+1][j])

为了保证在求f[i][j]时f[i+1][j-1]、f[i][k]、f[k+1][j]已经求完,第一层的i必须要倒着枚举,第二层j一定要正着枚举(手推一下就明白了QAQ)

求出f数组后,就要考虑怎样输出,因为输出的形式是(S)或[S],所以很显然用递归输出,加几个if特判就OK了。

然而,这道题我写完代码后一直是wa,三十分钟后才发现问题。

在读入t时,我一开始用的是cin>>t;看了题解后,终于发现应该是cin>>t后面再加上getchar();为什么呢?

终于发现困扰了我接近一个小时的问题根源了——

辣鸡洛谷出错题了!!样例中的t和第一组数据间有一行空格。。。(体现出看原题的重要性)

AC代码

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cmath>
  4. #include<cstdio>
  5. #include<cstring>
  6. #include<cstdlib>
  7. #include<queue>
  8. #include<set>
  9. #include<map>
  10. #include<vector>
  11. #include<iomanip>
  12. #include<ctime>
  13. #include<stack>
  14. using namespace std;
  15. string s;
  16. int t,len,f[][];
  17. void print(int l,int r){
  18. if(l>r) return;
  19. if(l==r){
  20. if(s[l]=='('||s[l]==')') printf("()");
  21. if(s[l]=='['||s[l]==']') printf("[]");
  22. return;
  23. }
  24. if((f[l][r]==f[l+][r-])&&((s[l]=='('&&s[r]==')')||(s[l]=='['&&s[r]==']'))){
  25. printf("%c",s[l]);
  26. print(l+,r-);
  27. printf("%c",s[r]);
  28. return;
  29. }
  30. for(int k=l;k<r;k++){
  31. if(f[l][r]==f[l][k]+f[k+][r]){
  32. print(l,k);
  33. print(k+,r);
  34. return;//找到一个正解就输出并return
  35. }
  36. }
  37. }
  38. int main()
  39. {
  40. scanf("%d",&t);
  41. getchar();
  42. while(t--){
  43. memset(f,0x3f,sizeof(f));
  44. getline(cin,s);
  45. getline(cin,s);
  46. len=s.length();
  47. if(len==){
  48. printf("\n\n");
  49. continue;
  50. }
  51. f[][]=;
  52. for(int i=;i<len;i++) f[i][i]=,f[i][i-]=;
  53. for(int i=len-;i>=;i--){
  54. for(int j=i+;j<len;j++){
  55. if((s[i]=='('&&s[j]==')')||(s[i]=='['&&s[j]==']')) f[i][j]=min(f[i][j],f[i+][j-]);
  56. for(int k=i;k<j;k++) f[i][j]=min(f[i][j],f[i][k]+f[k+][j]);
  57. }
  58. }
  59. print(,len-);
  60. printf("\n");
  61. if(t) printf("\n");
  62. }
  63. return ;
  64. }

UVA1626 括号序列 Brackets sequence(区间dp)的更多相关文章

  1. 洛谷 题解 UVA1626 【括号序列 Brackets sequence】

    看还没有人发记搜的题解,赶紧来水发一篇 我们定义dp[i][j]为区间i~j内最少添加几个括号才能把这个串变成正规括号序列. 考虑四种情况 i>j不存在这种子串,返回0 i==j子串长度为1无论 ...

  2. poj 1141 Brackets Sequence 区间dp,分块记录

    Brackets Sequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 35049   Accepted: 101 ...

  3. POJ 1141 Brackets Sequence(区间DP, DP打印路径)

    Description We give the following inductive definition of a “regular brackets” sequence: the empty s ...

  4. UVA 1626 Brackets sequence 区间DP

    题意:给定一个括号序列,将它变成匹配的括号序列,可能多种答案任意输出一组即可.注意:输入可能是空串. 思路:D[i][j]表示区间[i, j]至少需要匹配的括号数,转移方程D[i][j] = min( ...

  5. Ural 1183 Brackets Sequence(区间DP+记忆化搜索)

    题目地址:Ural 1183 最终把这题给A了.. .拖拉了好长时间,.. 自己想还是想不出来,正好紫书上有这题. d[i][j]为输入序列从下标i到下标j最少须要加多少括号才干成为合法序列.0< ...

  6. poj 1141 Brackets Sequence (区间dp)

    题目链接:http://poj.org/problem?id=1141 题解:求已知子串最短的括号完备的全序列 代码: #include<iostream> #include<cst ...

  7. poj 1141 Brackets Sequence ( 区间dp+输出方案 )

    http://blog.csdn.net/cc_again/article/details/10169643 http://blog.csdn.net/lijiecsu/article/details ...

  8. CF 149D Coloring Brackets(区间DP,好题,给配对的括号上色,求上色方案数,限制条件多,dp四维)

    1.http://codeforces.com/problemset/problem/149/D 2.题目大意 给一个给定括号序列,给该括号上色,上色有三个要求 1.只有三种上色方案,不上色,上红色, ...

  9. Brackets(括号最大匹配问题(区间dp))

    We give the following inductive definition of a “regular brackets” sequence: the empty sequence is a ...

随机推荐

  1. a标签实现下载canvas图片

    令 a 的 href = canvas.toDataURL("image/png");

  2. ubuntu移动分区,修改目录挂在点

    由于/tmp目录空间有点小,导致安装一个大软件的时候提示/tmp空间不足,最后通过创建新分区,并将新分区挂在到/tmp下,把/tmp空间扩大. 安装gparted 输入如下命令: sudo apt-g ...

  3. 脚本_统计 Linux 进程相关数量信息

    #!bin/bash#作者:liusingbon#功能:统计 Linux 进程相关数量信息,running(运行的进程),sleeping(睡眠中的进程),stoped(停止的进程),zombie(僵 ...

  4. hdu4417 Super Mario (树状数组/分块/主席树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4417 题目大意:给定一个长度为n的序列,有m个询问,每次询问包含l,r,h,即询问区间[l,r]小于等 ...

  5. 三、MyBatis-全局配置文件

    XML 映射配置文件(官方结构) MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置(settings)和属性(properties)信息.文档的顶层结构如下: configura ...

  6. bzoj5518 & loj3046 「ZJOI2019」语言 线段树合并+树链的并

    题目传送门 https://loj.ac/problem/3046 题解 首先问题就是问有多少条路径是给定的几条路径中的一条的一个子段. 先考虑链的做法. 枚举右端点 \(i\),那么求出 \(j\) ...

  7. 关于Extjs获取容器和元素的方法

    1.当前对象的父对象(上级对象) this.ownerCt: 2.当前对象的下一个相邻的对象 this.nextSibling(); 3.当前对象的上一个相邻的对象 this.previousSibl ...

  8. jinfo 干涉java runtime的jvm参数

    https://blog.csdn.net/bolg_hero/article/details/78156311 jinfo使用介绍可以用来查看正在运行的Java应用程序的扩展参数,甚至支持在运行时, ...

  9. What are the differences between an LES-SGS model and a RANS based turbulence model?

    The biggest difference between LES and RANS is that, contrary to LES, RANS assumes that \(\overline{ ...

  10. Task3.PyTorch实现Logistic regression

    1.PyTorch基础实现代码 import torch from torch.autograd import Variable torch.manual_seed(2) x_data = Varia ...