[poj P1141] Brackets Sequence
[poj P1141] Brackets Sequence
Time Limit: 1000MS Memory Limit: 65536K Special Judge
Description
Let us define a regular brackets sequence in the following way:1. Empty sequence is a regular sequence.
2. If S is a regular sequence, then (S) and [S] are both regular sequences.
3. If A and B are regular sequences, then AB is a regular sequence.For example, all of the following sequences of characters are regular brackets sequences:
(), [], (()), ([]), ()[], ()[()]
And all of the following character sequences are not:
(, [, ), )(, ([)], ([(]
Some sequence of characters '(', ')', '[', and ']' is given. You are to find the shortest possible regular brackets sequence, that contains the given character sequence as a subsequence. Here, a string a1 a2 ... an is called a subsequence of the string b1 b2 ... bm, if there exist such indices 1 = i1 < i2 < ... < in = m, that aj = bij for all 1 = j = n.
Input
The input file contains at most 100 brackets (characters '(', ')', '[' and ']') that are situated on a single line without any other characters among them.Output
Write to the output file a single line that contains some regular brackets sequence that has the minimal possible length and contains the given sequence as a subsequence.
Sample Input
([(]
Sample Output
()[()]
Source
Northeastern Europe 2001
括号匹配的变形题。
这题的范围,非常的适合区间dp。
那么我们来设计一个dp。设f[i][j]为将原串中i~j全部匹配好需要增加的字符数量。
则:
先赋值正无穷。
对于j-i+1==1 ---> f[i][j]=1
对于j-i+1==2 ---> f[i][j]=cmp(a[i],a[j])?0:2
对于j-i+1>=3 ---> f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]),if (cmp(a[i],a[j])) f[i][j]=min(f[i][j],f[i+1][j-1])
其中cmp代表两个字符是否匹配。
那么这样,就轻松计算出了f[1][n]。
这一题要让我们输出方案。
一般dp的题都可以用dfs递归输出方案。
具体实现应该很好想吧!但是有些细节和顺序容易搞错。
下面先给出几组数据(不一定完全相同,有spj没关系):
in1:
[]]]]
out1:
[][][][]
in2:
)))(((
out2:
()()()()()()
in3:
“空串”
out3:
“空串”
in4:
([][]([]()))[()]([])
out4:
([][]([]()))[()]([])
code:
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> using namespace std; ; int n,f[N][N]; char a[N]; bool vis[N]; int cmp(int x,int y) { ; ; ; } void dfs(int l,int r) { if (l>r) return; if (l==r) { if (vis[l]||vis[r]) return; if (a[l]=='(') printf("()"); else if (a[l]==')') printf("()"); else if (a[l]=='[') printf("[]"); else if (a[l]==']') printf("[]"); vis[l]=vis[r]=; return; } for (int i=l; i<r; i++) ][r]==f[l][r]) {dfs(l,i),dfs(i+,r); return;} if (cmp(l,r)) { vis[l]=vis[r]=; printf("%c",a[l]); dfs(l+,r-); printf("%c",a[r]); return; } } int main() { scanf(),n=strlen(a+); ) ; memset(f,,sizeof f); ; i<=n; i++) f[i][i]=; ; i<n; i++) )) f[i][i+]=; ]=; ; l<=n; l++) { ; i<=n-l+; i++) { ; ][j-]; ][j]); } } dfs(,n); cout<<endl; ; }
[poj P1141] Brackets Sequence的更多相关文章
- 区间DP POJ 1141 Brackets Sequence
Brackets Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 29520 Accepted: 840 ...
- POJ 1141 Brackets Sequence
Brackets Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 29502 Accepted: 840 ...
- poj 1141 Brackets Sequence 区间dp,分块记录
Brackets Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 35049 Accepted: 101 ...
- POJ 1141 Brackets Sequence(区间DP, DP打印路径)
Description We give the following inductive definition of a “regular brackets” sequence: the empty s ...
- POJ 1141 Brackets Sequence (区间DP)
Description Let us define a regular brackets sequence in the following way: 1. Empty sequence is a r ...
- poj 1141 Brackets Sequence (区间dp)
题目链接:http://poj.org/problem?id=1141 题解:求已知子串最短的括号完备的全序列 代码: #include<iostream> #include<cst ...
- poj 1141 Brackets Sequence(区间DP)
题目:http://poj.org/problem?id=1141 转载:http://blog.csdn.net/lijiecsu/article/details/7589877 定义合法的括号序列 ...
- POJ 1141 Brackets Sequence(括号匹配二)
题目链接:http://poj.org/problem?id=1141 题目大意:给你一串字符串,让你补全括号,要求补得括号最少,并输出补全后的结果. 解题思路: 开始想的是利用相邻子区间,即dp[i ...
- POJ 1141 Brackets Sequence(DP)
题目链接 很早 很早之前就看过的一题,今天终于A了.状态转移,还算好想,输出路径有些麻烦,搞了一个标记数组的,感觉不大对,一直wa,看到别人有写直接输出的..二了,直接输出就过了.. #include ...
随机推荐
- [摘抄] SFM 和 Visual SLAM
来自知乎: SFM和vSLAM基本讨论的是同一问题,不过SFM是vision方向的叫法,而vSLAM是robotics方向的叫法. vSLAM所谓的mapping,vision方向叫structure ...
- Echarts-图表根据值的不同展示成不同的颜色
series : [ { name:'直接访问', type:'bar', barWidth: '60%', ...
- Tensorflow之调试(Debug)及打印变量
参考资料:https://wookayin.github.io/tensorflow-talk-debugging 几种常用方法: 1.通过Session.run()获取变量的值 2.利用Tensor ...
- Java中try、finally语句中有return时的执行情况 [转]
原文:http://kingj.iteye.com/blog/1436761 在Java中当try.finally语句中包含return语句时,执行情况到底是怎样的,finally中的代码是否执行,大 ...
- 教你如何在win7中安装cygwin64
首先,说说我们为什么要安装cygwin吧,长期在win7下开发的人员可能不习惯使用unix系统,但由于工作问题,你又被逼要在unix环境下开发,那该如何是好啊?但现在你不用再纠结了,因为有cygwin ...
- 看懂MSSQL执行计划,分析SQL语句执行情况
打开SQL执行计划窗口 执行计划的图表是从右向左看的 SQL Server有几种方式查找数据记录 [Table Scan] 表扫描(最慢),对表记录逐行进行检查 [Clustered Index Sc ...
- Node.js学习准备篇
这里写个Node.js 准备篇包含内容有node.js 的安装,命令行运行node.js 文件,使用webStrom 编写 node.js 时有提示功能,并用webStrom 运行 Node.js 其 ...
- Python 多进程基本语法
需求: 在有多线程的情况下,我们可以使用线程帮我们处理一些事情,但是在python这里 由于RSA锁的缘故,我们只能够用到一个cpu帮我们处理事情,一个cpu在处理多个线程时,是通过上下文的切换使我 ...
- Keepalived原理与实战精讲--VRRP协议
. 前言 VRRP(Virtual Router Redundancy Protocol)协议是用于实现路由器冗余的协议,最新协议在RFC3768中定义,原来的定义RFC2338被废除,新协议相对还简 ...
- TabBar + TabBarView导航风格
import 'package:flutter/material.dart'; import 'News.dart'; import 'Video.dart'; import 'Chat.dart'; ...