Codevs3657括号序列题解

  • 题目描述 Description

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

    (1)空序列是合法的

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

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

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

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

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

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

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

  • 输入描述 Input Description

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

  • 输出描述 Output Description

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

  • 样例输入 Sample Input

    ([()

  • 样例输出 Sample Output

    2

  • 数据范围及提示 Data Size & Hint

    【样例说明】

    最少添加2个括号可以得到合法的序列:()[()]或([()])

    【数据范围】

    S的长度≤100 (最多100个字符)

  • 题解

    又是序列的题目。先一看不能顺着推,再一看不能倒着推,所以想到区间dp。以f[i][j]表示把区间[i,j]添成合法括号所需的最小括号数。

    设某段序列为S0,它对应区间为[i,j],括号数为f[i][j].

    若S0形如(S1)或[S1],f[i][j]=min{f[i][j],f[i+1][j?1]};即令S1合法后,S可合法。

    若S0形如(S1或[S1,f[i][j]=min{f[i][j],f[i][j?1]+1};即令S1合法后,S可在最后添加一个括号后合法。

    同理,若S0形如S1)或S1],f[i][j]=min{f[i][j],f[i+1][j]+1};

    无论S0是什么情况,都有f[i][j]=min{f[i][j],f[i][k]+f[k+1][j]},i≤k<j;即把序列分成两部分分别使其合法。

  • Code
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 110;
const int oo = 0x3f3f3f;
char ch[maxn];
int f[maxn][maxn], n;
void init()
{
    scanf("%s", &ch);
    n = strlen(ch);
    for(int i = 1; i <= n; ++i) f[i][i] = 1;
}
void work()
{
    for(int p = 1; p < n; ++p) for(int i = 1; i <= n - p; ++i)
    {
        int j = p + i;
        f[i][j] = oo;
        if((ch[i - 1] == ‘(‘ && ch[j - 1] == ‘)‘) || (ch[i - 1] == ‘[‘ && ch[j - 1] == ‘]‘))
            f[i][j] = f[i + 1][j - 1];
        if(ch[i - 1] == ‘(‘ || ch[i - 1] == ‘[‘) f[i][j] = min(f[i][j], f[i][j - 1] + 1);
        if(ch[j - 1] == ‘)‘ || ch[j - 1] == ‘]‘) f[i][j] = min(f[i][j], f[i + 1][j] + 1);
        for(int k = i; k < j; ++k) f[i][j] = min(f[i][j], f[i][k] + f[k + 1][j]);
    }
    printf("%d", f[1][n]);
}
int main()
{
    init();
    work();
    return 0;
}
时间: 2024-08-25 13:08:05

Codevs3657括号序列题解的相关文章

【基础练习】【区间DP】codevs3657 括号序列题解

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

[BZOJ 4350]括号序列再战猪猪侠 题解(区间DP)

[BZOJ 4350]括号序列再战猪猪侠 Description 括号序列与猪猪侠又大战了起来. 众所周知,括号序列是一个只有(和)组成的序列,我们称一个括号 序列S合法,当且仅当: 1.( )是一个合法的括号序列. 2.若A是合法的括号序列,则(A)是合法的括号序列. 3.若A,B是合法的括号序列,则AB是合法的括号序列. 我们考虑match[i]表示从左往右数第i个左括号所对应的是第几个右 括号,现在他得到了一个长度为2n的括号序列,给了你m个信息,第i 个信息形如ai,bi,表示match

uoj #31. 【UR #2】猪猪侠再战括号序列 贪心

#31. [UR #2]猪猪侠再战括号序列 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/31 Description 大家好我是来自百度贴吧的_叫我猪猪侠,英文名叫_CallMeGGBond. 我不曾上过大学,但这不影响我对离散数学.复杂性分析等领域的兴趣:尤其是括号序列理论,一度令我沉浸其中,无法自拔.至于OI算法竞赛,我年轻时确有参加,虽仅获一枚铜牌,但我素性淡泊,毫不在意,毕竟那所谓FFT.仙人掌之类

codevs 2058 括号序列

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

2058 括号序列

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

【BZOJ1095】【ZJOI2007】Hide 捉迷藏 线段树维护括号序列 数据结构的压缩。

链接: #include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/44829703"); } 题解: 首先由于此题太神以至于我其实还不会这道题,所以不妨介绍一下括号序列维护树构. 其实都是假的,就是一个点被扫到入栈的时候,序列加一个左括号,然后加入一个字符(可以不加),点出栈的时候就加一个右括号. 然

codevs——T3657 括号序列

http://codevs.cn/problem/3657/ 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 我们用以下规则定义一个合法的括号序列: (1)空序列是合法的 (2)假如S是一个合法的序列,则 (S) 和[S]都是合法的 (3)假如A 和 B 都是合法的,那么AB和BA也是合法的 例如以下是合法的括号序列: (), [], (()), ([]), ()[], ()[()] 以下是不合法括号序列的: (, [, 

3657 括号序列

时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 我们用以下规则定义一个合法的括号序列: (1)空序列是合法的 (2)假如S是一个合法的序列,则 (S) 和[S]都是合法的 (3)假如A 和 B 都是合法的,那么AB和BA也是合法的 例如以下是合法的括号序列: (), [], (()), ([]), ()[], ()[()] 以下是不合法括号序列的: (, [, ], )(, ([]), ([() 现在给定一些由'(', '

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

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