poj1141题解
题意
空序列是规则序列;用小括号(或者方括号)把一个规则序列括起来依然是规则序列;两个规则序列并列在一起仍然是规则序列。
给出一个括号字符串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题解的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
随机推荐
- 在Unity中使用 luajit 64位加密
参考:https://blog.csdn.net/sun19880421/article/details/68070696 https://blog.csdn.net/mydreamremindme/ ...
- 使用requests、BeautifulSoup、线程池爬取艺龙酒店信息并保存到Excel中
import requests import time, random, csv from fake_useragent import UserAgent from bs4 import Beauti ...
- 配置nginx代理服务器访问tomcat服务
nginx原配置文件如下: #user nobody; worker_processes ; #error_log logs/error.log; #error_log logs/error.log ...
- pikachu-服务器端请求伪造SSRF(Server-Side Request Forgery)
一.SSRF概述(部分内容来自pikachu平台) SSRF(Server-Side Request Forgery:服务器端请求伪造),其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功 ...
- 架构师成长系列 | 从 2019 到 2020,Apache Dubbo 年度回顾与总结
作者 | 刘军(陆龟)Apache Dubbo PMC 本文整理自架构师成长系列 2 月 18 日直播课程. 关注"阿里巴巴云原生"公众号,回复 "218",即 ...
- TampeMonkey 关于 youtube的两个插件
一个是 Video Speed Buttons 负责调速 一个是 YouTube Links 负责下载不同分辨率的视频
- AD常用命令以及概念
活动目录服务器常用命令合集如下: net accounts 查看第一台域控的计算机角色net accounts 查看计算机角色net share 查看共享netdom query fs ...
- em和rem区别
em大小依据父元素的字体大小的倍数 rem大小依据与根元素,即html标签的font-size大小
- python_函数笔记
第二章 函数编程 定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可 特性: 减少重复代码 使程序变的可扩展 使程序变得易维护 形参变量 只有在被调 ...
- java.lang.ClassCastException:java.util.LinkedHashMap不能转换为com.testing.models.xxx
后台接收前台的json字符串 转pojo 问题(Object 对应定义的pojo) ObjectMapper mapper=new ObjectMapper(); Object object = ma ...