题目传送门(洛谷)   题目传送门(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代码

 #include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<iomanip>
#include<ctime>
#include<stack>
using namespace std;
string s;
int t,len,f[][];
void print(int l,int r){
if(l>r) return;
if(l==r){
if(s[l]=='('||s[l]==')') printf("()");
if(s[l]=='['||s[l]==']') printf("[]");
return;
}
if((f[l][r]==f[l+][r-])&&((s[l]=='('&&s[r]==')')||(s[l]=='['&&s[r]==']'))){
printf("%c",s[l]);
print(l+,r-);
printf("%c",s[r]);
return;
}
for(int k=l;k<r;k++){
if(f[l][r]==f[l][k]+f[k+][r]){
print(l,k);
print(k+,r);
return;//找到一个正解就输出并return
}
}
}
int main()
{
scanf("%d",&t);
getchar();
while(t--){
memset(f,0x3f,sizeof(f));
getline(cin,s);
getline(cin,s);
len=s.length();
if(len==){
printf("\n\n");
continue;
}
f[][]=;
for(int i=;i<len;i++) f[i][i]=,f[i][i-]=;
for(int i=len-;i>=;i--){
for(int j=i+;j<len;j++){
if((s[i]=='('&&s[j]==')')||(s[i]=='['&&s[j]==']')) f[i][j]=min(f[i][j],f[i+][j-]);
for(int k=i;k<j;k++) f[i][j]=min(f[i][j],f[i][k]+f[k+][j]);
}
}
print(,len-);
printf("\n");
if(t) printf("\n");
}
return ;
}

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. openstack stein部署手册 4. glance

    # 建立数据库用户及权限 create database glance; grant all privileges on glance.* to glance@'localhost' identifi ...

  2. Rust(一)介绍 安装

    目录 Rust安装 Rust介绍: Windows 安装步骤: Helle world 创建项目文件夹: 写并执行程序: Rust安装 安装过程简单快捷,直接参照官网即可,Rust安装 Rust介绍: ...

  3. $LCT$维护子树信息学习笔记

    \(LCT\)维护子树信息学习笔记 昨天\(FDF\)好题分享投了 \([ZJOI2018]\)历史 这题. 然后我顺势学学这个姿势. 结果调了一年...于是写个笔记记录一下. 基本原理 比较显然地, ...

  4. [洛谷 P1377] TJOI2011 树的序

    问题描述 众所周知,二叉查找树的形态和键值的插入顺序密切相关.准确的讲:1.空树中加入一个键值k,则变为只有一个结点的二叉查找树,此结点的键值即为k:2.在非空树中插入一个键值k,若k小于其根的键值, ...

  5. RedHat Linux6.4下安装apache服务

    一.换yum 原因:安装apache2.4是需要安装apr . apr-util .pcre.httpd四个包, 在安装pcre包时会报错: configure: error: You need a ...

  6. Cluster基础(二):ipvsadm命令用法、部署LVS-NAT集群、部署LVS-DR集群

    一.ipvsadm命令用法 目标: 准备一台Linux服务器,安装ipvsadm软件包,练习使用ipvsadm命令,实现如下功能: 使用命令添加基于TCP一些的集群服务 在集群中添加若干台后端真实服务 ...

  7. 使用iScroll时input复选框不能选中解决方法

    http://blog.csdn.net/xw505501936/article/details/51886018

  8. CentOS-7.4(1708)release notes发行注记

    Red Hat Enterprise Linux 当前的最新版本是 7.3. Red Hat Enterprise Linux 7 当前仅支持 64 位CPU:64-bit AMD.64-bit In ...

  9. BF语言学习

    Brainfuck是一种极小化的计算机语言,它是由Urban Müller在1993年创建的.由于fuck在英语中是脏话,这种语言有时被称为brainf*ck或brainf**k,甚至被简称为BF.这 ...

  10. HTML中margin与padding的区别!(转)

    我们以DIV为一个盒子为例,既然和现实生活中的盒子一样,那我们想一下,生活中的盒子内部是不是空的好用来存放东西,而里面存放东西的区域我们给他起个名字叫“content(内容)”,而盒子的纸壁给他起个名 ...