[codevs3657]括号序列
题目大意:有一列只有'(',')','[',']'构成的括号序列,求在序列中至少加上多少括号,能使该序列合法。
解题思路:区间dp。
我们以$f[i][j]$表示把区间$[i,j]$添成合法括号所需的最小括号数。
设某段序列为$S_0$,它对应区间为$[i,j]$,括号数为$f[i][j]$.
若$S_0$形如$(S_1)$或$[S_1]$,$f[i][j]=min\{f[i][j],f[i+1][j−1]\}$;即令$S_1$合法后,$S_0$可合法。
若$S_0$形如$(S_1$或$[S_1$,$f[i][j]=min\{f[i][j],f[i+1][j]+1\}$;即令$S_1$合法后,$S_0$可在最后添加一个括号后合法。
同理,若$S_0$形如$S_1)$或$S_1]$,
$f[i][j]=min\{f[i][j],f[i][j-1]+1\}$;
无论$S_0$是什么情况,都有$f[i][j]=min\{f[i][j],f[i][k]+f[k+1][j]\},i≤k<j$;
即把序列分成两部分分别使其合法。
这样的时间复杂度为$O(n^3)$。
注意i要倒着循环,否则可能会出现某些情况还没计算就要使用的情况。
C++ Code:
#include<cstdio>
#include<cstring>
#define min(a,b) (((a)<(b))?(a):(b))
char s[120];
int f[120][120];
int main(){
scanf("%s",s+1);
int n=strlen(s+1);
memset(f,0,sizeof f);
for(int i=1;i<=n;++i){
f[i][i]=1;
for(int j=i+1;j<=n;++j)f[i][j]=0x3f3f3f3f;
}
for(int i=n;i;--i){
for(int j=i+1;j<=n;++j){
if(s[i]=='('&&s[j]==')'||s[i]=='['&&s[j]==']')
f[i][j]=f[i+1][j-1];
if(s[i]=='('||s[i]=='[')
f[i][j]=min(f[i][j],f[i+1][j]+1);
if(s[i]==')'||s[i]==']')
f[i][j]=min(f[i][j],f[i][j-1]+1);
for(int k=i;k<j;++k)
f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]);
}
}
printf("%d\n",f[1][n]);
return 0;
}
[codevs3657]括号序列的更多相关文章
- 【区间DP】codevs3657 括号序列题解
题目描述 Description 我们用以下规则定义一个合法的括号序列: (1)空序列是合法的 (2)假如S是一个合法的序列,则 (S) 和[S]都是合法的 (3)假如A 和 B 都是合法的,那么AB ...
- BZOJ4350: 括号序列再战猪猪侠
Description 括号序列与猪猪侠又大战了起来. 众所周知,括号序列是一个只有(和)组成的序列,我们称一个括号 序列S合法,当且仅当: 1.( )是一个合法的括号序列. 2.若A是合法的括号序列 ...
- DP专题——括号序列
毕竟是个渣,写完一遍之后又按LRJ的写了一遍,再写了一遍递归版,最终加上输出解部分 括号序列 定义如下规则序列(字符串): 空序列是规则序列: 如果S是规则序列,那么(S)和[S]也是规则序列: 如果 ...
- 【BZOJ】2209: [Jsoi2011]括号序列(splay)
http://www.lydsy.com/JudgeOnline/problem.php?id=2209 splay又犯逗........upd1那里的sum忘记赋值反............. 本题 ...
- 51nod1476 括号序列的最小代价
这题应该可以用费用流写吧?不过我想不出贪心来TAT.其实还是单调队列乱搞啊T_T //ÍøÉϵÄ̰ÐÄËã·¨ºÃÉñ°¡¡£¡£¡£ÎÒÖ»»áÓÃ×îС·ÑÓÃ×î´óÁ÷ÅÜTAT #in ...
- lintcode: 有效的括号序列
题目: 有效的括号序列 给定一个字符串所表示的括号序列,包含以下字符: '(', ')', '{', '}', '[' and']', 判定是否是有效的括号序列. 样例 括号必须依照 "() ...
- uoj #31. 【UR #2】猪猪侠再战括号序列 贪心
#31. [UR #2]猪猪侠再战括号序列 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/31 Descript ...
- bzoj 1095 [ZJOI2007]Hide 捉迷藏(括号序列+线段树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1095 [题意] 给定一棵树,树上颜色或白或黑而且可以更改,多个询问求最远黑点之间的距离 ...
- CODEVS 3657 括号序列
[问题描述] 我们用以下规则定义一个合法的括号序列: (1)空序列是合法的 (2)假如S是一个合法的序列,则 (S) 和[S]都是合法的 (3)假如A 和 B 都是合法的,那么AB和BA也是合法的 例 ...
随机推荐
- Java入门基础—面向对象开发
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大和简单易用两个特征.Java语言作为静态面向对象编程语言的代表 ...
- HDU 2078 选课时间( 水题 )
链接:传送门 思路:水题略 /************************************************************************* > File N ...
- POJ 1743 [USACO5.1] Musical Theme (后缀数组+二分)
洛谷P2743传送门 题目大意:给你一个序列,求其中最长的一对相似等长子串 一对合法的相似子串被定义为: 1.任意一个子串长度都大于等于5 2.不能有重叠部分 3.其中一个子串可以在全部+/-某个值后 ...
- 基于S5PC100的FIMC控制器解析
作者:邹南,华清远见嵌入式学院讲师. http://www.cnblogs.com/gooogleman/archive/2012/07/26/2610449.html CAMERA SENSOR O ...
- python web开发 编写web框架
参考链接:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143233900 ...
- 循环语句第2种 WHILE ... LOOP END LOOP;
--------第2种-------- WHILE ... LOOP END LOOP; declare n number(3) :=1; begin WHILE n&l ...
- WinServer-IIS-js无法加载问题
IIS中无法加载JS文件错误 尝试下面的几种解决方法,一起用
- nodejs是一个平台,是平台
node.js是用javascript来写服务器代码的平台
- POJ 1107
水题一道,注意取模时不能为0 #include <iostream> #include <algorithm> #include <cstring> #includ ...
- HDU 1796
呃,我竟然傻了,同时被a且b整除的个数为n/(a*b). 其实应该是n/[a,b]才对,是他们的最小公倍数啊... #include <iostream> #include <cst ...