题意

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

给出一个括号字符串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. JavaScript节流与防抖函数封装

    js节流与防抖函数封装 常见应用场景: window的 resize 和 scroll 事件: 文字输入时的 keyup 事件: 元素拖拽.移动时的 mousemove 事件: 防抖 定义:多次触发事 ...

  2. Winfrom 减少控件重绘闪烁的方法

    Winform控件的双缓冲.控件的双缓冲属性是隐藏的,可以通过反射改变其属性值. lv.GetType().GetProperty("DoubleBuffered", Bindin ...

  3. MS14-068提权和impacket工具包提权

    ms14-068提权 工具利用 a)拿下边界机win7,并已经有win7上任意一个账号的密码 -u 用户名@域 -p 用户密码 -s 用户sid -d 域控 ms14-068.exe -u test3 ...

  4. Git安装与配置,以及pycharm提交代码到github

    1.下载git,安装 下载好后直接下一步到底,安装成功(选择组件页面,可以勾选上控制台窗口字体选项,如下图) 2.配置Git信息 1.打开窗口中,输入:git --version 查看已安装的git版 ...

  5. windows本地安装Oracle数据库

    一.下载Oracle 11g R2 for Windows. 官方网站: https://www.oracle.com/database/technologies/oracle-database-so ...

  6. IIS WEB站点设置

    IIS安装 打开控制面板 -> 程序 -> 打开或关闭Windows功能 ,在弹出得对话框中选择“Internet信息服务”复选框.我这里是Windows server 2019 ,界面有 ...

  7. css权值和优先级+命名规范

    选择器权值: 标签选择器:1 类选择器和伪类选择器:10 ID选择器:100 通配符选择器:0 行内样式:1000 !important 在一定条件下,优先级最高 常用的css样式命名 页面结构页头: ...

  8. docker搭建环境积累

    weblogic12搭建 sudo docker pull ismaleiva90/weblogic12 sudo docker run -d -p : -p : ismaleiva90/weblog ...

  9. 剑指offer-面试题36-二叉搜索树与双向链表-中序遍历

    /* 题目: 将二叉搜索树转化为排序的双向链表,不能创建新的节点, 只能调整节点的指向,返回双向链表的头节点. */ /* 思路: 递归. 二叉搜索树的中序遍历得到的序列是递增序列. 左子树left& ...

  10. swiper滑动失效问题

    最近在写移动端的项目,页面有用的是swiper滑动的. 但是会发现在滑动时,不灵活,就是滑动时隐藏的数据会显示,但是不滑动数据又在初始那,隐藏的数据还是看不到. 于是各种排除问题,终于在pc端+移动端 ...