洛谷 题解 UVA1626 【括号序列 Brackets sequence】
看还没有人发记搜的题解,赶紧来水发一篇
我们定义dp[i][j]
为区间i~j
内最少添加几个括号才能把这个串变成正规括号序列。
考虑四种情况
i>j
不存在这种子串,返回0
i==j
子串长度为1
无论是"[","]","(",")"
都是要消耗1的,返回1
s=(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\)的方案 ...
随机推荐
- 2 使用unitest 模块扩展功能测试
准备做一个 待办事项清单网站,来演示 Web 开发过程中的所有主要步骤.以及如何在各个步骤中运用TDD理念. ”功能测试“: 从用户的角度查看应用是如何运作的. 从某种程度上可以作为应用的说明书. 作 ...
- paramiko的使用
import paramiko import sys user = "root" pwd = " # 上传文件 def sftp_upload_file(server_p ...
- sqlserver中产生随机字符,随机数
SELECT REPLACE(NEWID(),'-','') select replicate(char(cast(rand()*1000 as int)%26+97) +char(cast(rand ...
- @Component,@Service,@Controller,@Repository
1.@controller 控制器(注入服务) 2.@service 服务(注入dao) 3.@repository dao(实现dao访问) 4.@component (把普通pojo实例化到spr ...
- learning armbian steps(4) ----- armbian 技术内幕
在学习新的框架之前,肯定有一个原型机,通过最普通的指令来实现其功能. 做到这一点之后,所有的东西都不在是秘密,缺的时间进行系统深入的学习. 其实可以自已先来手动构建一个原生的arm 文件系统,基于qe ...
- [Luogu] U18430 萌萌的大河
https://www.luogu.org/problemnew/show/U18430 思路比较好想 树链剖分 对于1操作 只需将以该点为根的子树打标记,将所有数存入数组排序 每次进行1操作时,判断 ...
- .net Core使用 MongoDB
1.安装mogodb windows版本下载地址:https://www.mongodb.com/download-center/v2/community 查看mongod.conf文件,找到绑定的I ...
- scrapy框架之log日志
scrapy中的debug信息 在scrapy中设置log 1.在settings中设置log级别,在settings.py中添加一行: Scrapy提供5层logging级别: CRITICAL - ...
- 测试puppeteer模拟度检测
var puppeteer = require('puppeteer'); const devices = require('puppeteer/DeviceDescriptors'); const ...
- Ubuntu无法找到add-apt-repository问题的解决方法
网上查了一下资料,原来是需要 python-software-properties 于是 apt-get install python-software-properties 除此之外还要安装 s ...