洛谷 题解 UVA1626 【括号序列 Brackets sequence】
看还没有人发记搜的题解,赶紧来水发一篇
我们定义dp[i][j]为区间i~j内最少添加几个括号才能把这个串变成正规括号序列。
考虑四种情况
i>j不存在这种子串,返回0i==j子串长度为1无论是"[","]","(",")"都是要消耗1的,返回1s=(s')或s=[s']那么返回的是DP(i+1,j-1)其他情况,枚举断点,详见代码
至于输出嘛.....不会,看紫书的,输出代码的解释看看楼上吧,这里就不详细解释了
代码:
#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
int T,n;
string s;
int dp[110][110];//记忆
inline int DP(int l,int r)//记搜
{
if(l==r)return dp[l][r]=1;//②
if(l>r)return dp[l][r]=0;//①
if(dp[l][r]!=INF)return dp[l][r];//记忆化
if(s[l-1]=='('&&s[r-1]==')'||s[l-1]=='['&&s[r-1]==']')dp[l][r]=min(dp[l][r],DP(l+1,r-1));//③
for(int i=l;i<r;i++)//枚举i~j的断点
{
dp[l][r]=min(dp[l][r],DP(l,i)+DP(i+1,r));//④
}
return dp[l][r];
}
inline void print(int l,int r)//输出
{
if(l>r)return;
if(l==r)
{
if(s[l-1]=='('||s[l-1]==')')
cout<<"()";
if(s[l-1]=='['||s[l-1]==']')
cout<<"[]";
return;
}
if(dp[l][r]==dp[l+1][r-1]&&((s[l-1]=='('&&s[r-1]==')')||(s[l-1]=='['&&s[r-1]==']')))
{
cout<<s[l-1];
print(l+1,r-1);
cout<<s[r-1];
}
else
{
for(int i=l;i<r;i++)
{
if(dp[l][r]==dp[l][i]+dp[i+1][r])
{
print(l,i);
print(i+1,r);
return;
}
}
}
}
int main()
{
scanf("%d",&T);
getchar();
while(T--)
{
memset(dp,0x3f,sizeof(dp));
getline(cin,s);
getline(cin,s);
//这里要小心,输入的可能是空串!!!!!!!!坑了我很久了
int n=s.size();
//cout<<n<<" "<<s<<endl;
if(!n)
{
cout<<endl<<endl;
continue;
}
DP(1,n);
//cout<<DP(1,n)<<endl;
print(1,n);
cout<<endl;
if(T)cout<<endl;//输出格式也要注意!!
}
return 0;
}
洛谷 题解 UVA1626 【括号序列 Brackets sequence】的更多相关文章
- UVA1626 括号序列 Brackets sequence(区间dp)
题目传送门(洛谷) 题目传送门(UVA) 解题思路 很显然是一个区间dp,当然记忆化搜索完全可以AC,这里说一下区间dp. 区间dp的重要特征就是需要枚举中间节点k 看一看这道题,用f[i][j] ...
- 洛谷 2023 [AHOI2009]维护序列
洛谷 2023 [AHOI2009]维护序列 洛谷原题传送门 这个题也是一道经典的线段树模版(其实洛谷的模版二改一下输入顺序就能AC),其中包括区间乘法修改.区间加法修改.区间查询三个操作. 线段树的 ...
- 洛谷P2023 [AHOI2009]维护序列(线段树区间更新,区间查询)
洛谷P2023 [AHOI2009]维护序列 区间修改 当我们要修改一个区间时,要保证 \(ax+b\) 的形式,即先乘后加的形式.当将区间乘以一个数 \(k\) 时,原来的区间和为 \(ax+b\) ...
- 洛谷 P4093 [HEOI2016/TJOI2016]序列 CDQ分治优化DP
洛谷 P4093 [HEOI2016/TJOI2016]序列 CDQ分治优化DP 题目描述 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他. 玩具上有一个数列,数列中某些项的值可能会 ...
- 【题解】洛谷P2023 [AHOI2009] 维护序列(线段树)
洛谷P2023:https://www.luogu.org/problemnew/show/P2023 思路 需要2个Lazy-Tag 一个表示加的 一个表示乘的 需要先计算乘法 再计算加法 来自你谷 ...
- 洛谷 P3215 [HNOI2011]括号修复 / [JSOI2011]括号序列(fhq-treap)
题目链接 题意:有一个长度为 \(n\) 的括号序列,你需要支持以下操作: 将 \([l,r]\) 中所有括号变为 \(c\) 将 \([l,r]\) 区间翻转 将 \([l,r]\) 区间中左括号变 ...
- [洛谷P2023] [AHOI2009]维护序列
洛谷题目链接:[AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列 ...
- BZOJ4553/洛谷P4093 [HEOI2016/TJOI2016]序列 动态规划 分治
原文链接http://www.cnblogs.com/zhouzhendong/p/8672434.html 题目传送门 - BZOJ4553 题目传送门 - 洛谷P4093 题解 设$Li$表示第$ ...
- 【洛谷3321_BZOJ3992】[SDOI2015]序列统计(原根_多项式)
题目: 洛谷3321 分析: 一个转化思路比较神(典型?)的题-- 一个比较显然的\(O(n^3)\)暴力是用\(f[i][j]\)表示选了\(i\)个数,当前积在模\(m\)意义下为\(j\)的方案 ...
随机推荐
- 3、获取Class对象的三种方式
3.获取Class对象的三种方式 要想对字节码文件进行解刨,必须要有字节码文件对象 Object类中的getClass方法 通过对象静态属性 .class来获取对应的Class对象 只要通过给定类的字 ...
- 使用Django 测试客户端一起测试视图,模板和URL
Django 测试客户端 self.client.get(url) 测试客户端是Django中TestCase类的一个属性名. 至此已经在网站中可以创建一个清单了. 那么,现在是可以在unit te ...
- HTMl5的存储方式sessionStorage和localStorage区别及联系
localStorage 和 sessionStorage 属性允许在浏览器中存储 key/value 对的数据. localStorage 用于长久保存整个网站的数据,保存的数据没有过期时间,直到手 ...
- Spring Boot 如何部署到 Linux 中的服务
打包完成后的 Spring Boot 程序如何部署到 Linux 上的服务? 你可以参考官方的有关部署 Spring Boot 为 Linux 服务的文档. 文档链接如下: https://docs. ...
- c实现循环链表
解决约瑟夫环问题核心步骤: 1.建立具有n个节点.无头的循环链表 2.确定第一个报数人的位置 3.不断从链表中删除链节点,直到链表为空 #include <iostream> #inclu ...
- Undertow
Spring Boot 内嵌容器Undertow参数设置 配置项: # 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程 # 不要设置过大,如果过大,启动 ...
- ORM 数据库使用
使用 Flask-SQLAlchemy 来操作数据库 1 配置 本文使用sqlite来作为例子演示,在config.py里面更新下数据库的配置 import os basedir = os.path ...
- Pluck CMS 4.7.10远程代码执行漏洞分析
本文首发于先知: https://xz.aliyun.com/t/6486 0x01漏洞描述 Pluck是用php编写的一款的小型CMS影响版本:Pluck CMS Pluck CMS 4.7.10( ...
- Springboot使用zuul进行负载均衡
完整项目代码地址参考:https://github.com/SimonHu1993/SpringbootZuul 1.这里我们使用Eureka来作为服务的注册与发现中心,首先看看Eureka clie ...
- vmware安装Linux