题意

空序列是规则序列;用小括号(或者方括号)把一个规则序列括起来依然是规则序列;两个规则序列并列在一起仍然是规则序列。

给出一个括号字符串S,求一个规则序列ANS,满足S是ANS的子序列且ans尽可能短。

ANS不唯一,是special judge

记录状态转移过程的dp+递归输出

先把问题变简单一点,

①只求最少需要添加多少个字符

f[l][i]表示处理从s[i]开始的l个字符需要添加的最少字符

显然

f[0][i]=0

f[1][i]=1

f[l][i] ------- s[i]...s[i+l-1]

可以拆分成AB两段来解决,枚举拆分的第一段的长度ll

ll从1到l-1

显然需要添加字符数=f[ll][i]+f[l-ll][i+ll]

f[l][i]只要取这些不同ll取法下的最小值即可

注意若s[i]与s[i+l-1]已经匹配,则可以变成(A)或[A]的模式,即可以转换成f[l-2][i+1]的问题;

ps,这里wa了一次,一开始s[i]与s[i+l-1]匹配时没有枚举ll拆分。

②如何构造出添加后的最短字符串?

只需要另开一个数组在上面f[i][j]选取最优的ll时记录下ll,那么就可以成功的缩小问题的规模。当然有可能是情况(1),这种可以特殊记录,比如记录取的ll是0.

规模可以一步步的缩小,然后终止条件——

规模足够小时——

(1)只有一个字符时,显然只需要在它右边添加对应的右括号即可

(2)只有0个字符时,什么都不干,不再缩小

#include<cstdio>
#include<cstring>
using namespace std;
const int maxl=1000;
char ss[maxl+1],s[maxl+1];
int f[maxl+1][maxl],prel[maxl+1][maxl];
inline char l2r(char a)
{
return a=='('?')':(a=='['?']':0);
} void print(int l,int i)
{
if (l==0) return;
else if (l==1) {
switch(s[i]){
case '(':
case ')':printf("()");return;
case '[':
case ']':printf("[]");return;
}
} else if (!prel[l][i]) {
printf("%c",s[i]);
print(l-2,i+1);
printf("%c",s[i+l-1]);
} else {
print(prel[l][i],i);
print(l-prel[l][i],i+prel[l][i]);
}
} int main()
{
int len,t,ll;
while(gets(ss)!=NULL) {
len=0;
for (int i=0;ss[i];++i)
if (ss[i]=='('||ss[i]==')'||ss[i]=='['||ss[i]==']')
s[len++]=ss[i];
for (int i=0;i<len;++i) {
f[0][i]=0;f[1][i]=1;
}
for (int l=2;l<=len;++l)
for (int i=0;i+l<=len;++i) {
f[l][i]=l+1;
for (ll=1;ll<l;++ll) {
t=f[ll][i]+f[l-ll][i+ll];
if(f[l][i]>t) {
f[l][i]=t;
prel[l][i]=ll;
}
}
if (l2r(s[i])==s[i+l-1]) {
t=f[l-2][i+1];
if(f[l][i]>t) {
f[l][i]=t;
prel[l][i]=0;
}
}
}
print(len,0);
printf("\n");
}
return 0;
}

poj1141题解的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

随机推荐

  1. shell脚本 server httpd 控制程序

    原版的脚本里  查看status  需要用 lynx这个命令,还要开启http://localhost:80/server-status   比较麻烦,我直接注释了,新加的代码用红色字体       ...

  2. linux入门系列13--磁盘管理之RAID、LVM技术

    前一篇文章学习了磁盘分区.格式化.挂载等相关知识,本文将讲解RAID和LVM技术. 磁盘管理操作主要是运维人员用的较多,如果只是单纯的开发人员,可以先略过本文.但是在很多小公司里往往都是一人多用,运维 ...

  3. table-cell设置宽高、居中

    table-cell默认宽高由内容决定 <style type="text/css" rel="stylesheet"> .content { co ...

  4. JMeter接口测试-循环读取库的用户信息

    前言 如何实现循环读取数据库的用户信息,并传递到下一个登录请求呢,下面我们一起来学习吧!在之前我们已经学会了利用JMeter连接数据库了,具体操作可以看我之前的随笔JMeter接口测试-JDBC测试 ...

  5. linux安装python3环境并配置虚拟环境

    1.安装必要库 yum -y install gcc yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite- ...

  6. Python 编程入门(2):复杂数据类型(列表,字典)

    以下所有例子都基于最新版本的 Python,为了便于消化,每一篇都尽量短小精悍,希望你能尽力去掌握 Python 编程的「概念」,可以的话去动手试一下这些例子(就算目前还没完全搞懂),加深理解. 在 ...

  7. 避免js重复加载的问题

    避免js重复加载的问题 在日常开发中,一个页面加载另一个页面的时候,就会把另一个页面的js也会加载进来,那么如何才能避免被加载页面不再重复加载已经加载过的js呢? 先上代码 动态加载js // 加载j ...

  8. 面向对象+闭包+三种对象的声明方式(字面式、new Object、构造函数、工厂模式、原型模式、混合模式)

    面向对象: 对代码的一种抽象,对外统一提供调用接口的编程思想 对象的属性:事物自身拥有的东西 对象的方法:事物的功能 对象:事物的一个实例 对象的原型:.prototype -> 内存地址 -& ...

  9. P4392 [BOI2007]Sound 静音问题

    ---------------------- 链接:Miku ----------------------- 这道题本质上还是个st表,只要两个st表,然后对于每一个点,查询他开始的 长度为m的去年的 ...

  10. tomcat下载页面多个版本区别