codevs——T3657 括号序列

http://codevs.cn/problem/3657/

时间限制: 1 s

空间限制: 256000 KB

题目等级 : 黄金 Gold

题解

题目描述 Description

我们用以下规则定义一个合法的括号序列:

(1)空序列是合法的

(2)假如S是一个合法的序列,则 (S) 和[S]都是合法的

(3)假如A 和 B 都是合法的,那么AB和BA也是合法的

例如以下是合法的括号序列:

()[](())([])()[]()[()]

以下是不合法括号序列的:

([])(([])([()

现在给定一些由‘(‘, ‘)‘, ‘[‘, ,‘]‘构成的序列 ,请添加尽量少的括号,得到一个合法的括号序列。

输入描述 Input Description

输入包括号序列S。含最多100个字符(四种字符: ‘(‘, ‘)‘, ‘[‘ and ‘]‘) ,都放在一行,中间没有其他多余字符。

输出描述 Output Description

使括号序列S成为合法序列需要添加最少的括号数量。

样例输入 Sample Input

([()

样例输出 Sample Output

2

数据范围及提示 Data Size & Hint

【样例说明】
最少添加2个括号可以得到合法的序列:()[()]或([()])
【数据范围】
S的长度<=100 (最多100个字符)。
 1 #include <algorithm>
 2 #include <iostream>
 3 #include <cstring>
 4 #include <string>
 5 #include <cstdio>
 6
 7 using namespace std;
 8
 9 string s;
10 int f[10015][10015];
11
12 int main()
13 {
14     cin>>s;
15     int len=s.size();
16     for(int i=1;i<=len;i++) f[i][i]=1;
17     for(int l=2;l<=len;l++)
18         for(int i=1;i<=len-l+1;i++)
19         {
20             int j=l+i-1;
21             f[i][j]=1e7;
22             if((s[i-1]==‘(‘&&s[j-1]==‘)‘)||(s[i-1]==‘[‘&&s[j-1]==‘]‘))
23                 f[i][j]=f[i+1][j-1];
24             for(int k=i;k<j;k++)
25                 f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]);
26         }
27     printf("%d",f[1][len]);
28     return 0;
29 }
时间: 2024-10-08 10:16:43

codevs——T3657 括号序列的相关文章

codevs 2058 括号序列

2058 括号序列 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题解 题目描述 Description 定义满足以下规则字符串为规则序列,否则不是规则序列: 1.空序列是规则序列: 2.如果S是规则序列,那么(S),[S],{S}和<S>也是规则序列: 3.如果A和B都是规则序列,那么AB也是规则序列. 例如,下面的字符串都是规则序列: (),[],(()),([]),()[],()[()],{{}}<>,([]<>{{}}),

Codevs (3657括号序列 )

题目链接:传送门 题目大意:中文题,略 题目思路:区间DP 这个题是问需要添加多少个括号使之成为合法括号序列,那么我们可以先求有多少合法的括号匹配,然后用字符串长度减去匹配的括号数就行 状态转移方程主要是对于我们枚举的区间 dp[i][j],如果 i 和 j 处的括号能够匹配,则dp[i][j]=dp[i+1][j-1]+1; 因为我们是从小到大枚举长度,所以小长度的区间一定是最优的,所以当 i 与 j 匹配时,则是子区间的最优值+1 #include <iostream> #include

CODEVS 3657 括号序列

[问题描述] 我们用以下规则定义一个合法的括号序列: (1)空序列是合法的 (2)假如S是一个合法的序列,则 (S) 和[S]都是合法的 (3)假如A 和 B 都是合法的,那么AB和BA也是合法的 例如以下是合法的括号序列: (), [], (()), ([]), ()[], ()[()] 以下是不合法括号序列的: (, [, ], )(, ([]), ([() 现在给定一些由'(', ')', '[', ,']'构成的序列 ,请添加尽量少的括号,得到一个合法的括号序列. [输入] 输入包括号序

数据结构(括号序列,线段树):ZJOI 2007 捉迷藏

[题目描述] Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩捉迷藏游戏.他们的家很大且构造很奇特,由N个屋子和N-1条双向走廊组成,这N-1条走廊的分布使得任意两个屋子都互相可达. 游戏是这样进行的,孩子们负责躲藏,Jiajia负责找,而Wind负责操纵这N个屋子的灯.在起初的时候,所有的灯都没有被打开.每一次,孩子们只会躲 藏在没有开灯的房间中,但是为了增加刺激性,孩子们会要求打开某个房间的电灯或者关闭某个房间的电灯.为了评估某一次

【UOJ】【UR #2】猪猪侠再战括号序列(splay/贪心)

http://uoj.ac/problem/31 纪念伟大的没有调出来的splay... 竟然那个find那里写错了!!!!!!!!!!!!! 以后要记住:一定要好好想过! (正解的话我就不写了,太简单了.. #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream> #include <algorithm> #

喵哈哈村的括号序列

描述 喵哈哈村的括号序列和外界的括号序列实际上是一样的. 众所周知"()"这样的,就是一个标准的括号序列:"()()()()"这样也是括号序列:"((()))()"这样也是一个合法的括号序列.但是"((("这样,就不是一个合法的括号序列了. 现在沈宝宝非常好奇,给你一个字符串,请从中找出最长的合法括号序列出来. 不知道你能找到吗? 输入 第一行一个T,表示有T组数据.接下来T行,每一行都是一个字符串.保证字符串的长度小于100

3295: 括号序列 -(序列DP)

描述 给定一串字符串,只由 “[”.“]” .“(”.“)”四个字符构成.现在让你尽量少的添加括号,得到一个规则的序列. 例如:“()”.“[]”.“(())”.“([])”.“()[]”.“()[()]”,都是规则的序列.这几个不是规则的,如:“(”.“[”.“]”.“)(”.“([()”. 输入 输入有多组测试数据.输入一串字符串序列,长度不大于255. 输出 输出最少添加的括号数目. 样例输入 () ( ([() [[(([] 样例输出 0 1 2 4 题目来源 椒江校区第一届C语言编程大

BZOJ2209: [Jsoi2011]括号序列

传送门 splay练习. 考虑把括号序列转化成类似于区间最大/最小值的情况. 显然我们可以知道括号序列消完的情况肯定是$a$个)和$b$个(,那么把这些括号全部合法化的代价显然就是$\frac{a+1}{2}+\frac{b+1}{2}$. 接着我们可以把'('变为1,把')'变为-1,然后每次取左区间的连续最小值,右区间的连续最大值,就是$a$与$b$的大小. 因为存在区间翻转,所以需要把左/右区间的连续最大/小值都搞出来. splay即可. //BZOJ2209 //by Cydiater

九度oj 题目1337:寻找最长合法括号序列

题目描述: 给你一个长度为N的,由’(‘和’)’组成的括号序列,你能找出这个序列中最长的合法括号子序列么?合法括号序列的含义便是,在这个序列中,所有的左括号都有唯一的右括号匹配:所有的右括号都有唯一的左括号匹配.例如:((()))()()便是一个长度为10的合法括号序列,而(()))( 则不是. 需要你求解的是,找出最长的合法括号子序列的长度,同时找出具有这样长度的序列个数. 输入: 测试数据包括多个,每个测试数据包含两行: 第一行为一个整数N,其中N不会超过10^6. 第二行为一个长度为N的字