返回顶部
大江东去,浪淘尽,千古风流人物。故垒西边,人道是,三国周郎赤壁。乱石穿空,惊涛拍岸,卷起千堆雪。江山如画,一时多少豪杰。遥想公瑾当年,小乔初嫁了,雄姿英发。羽扇纶巾,谈笑间,樯橹灰飞烟灭。故国神游,多情应笑我,早生华发。人生如梦,一尊还酹江月。

一本通 5.1 练习 1」括号配对

plysc

#10150. 「一本通 5.1 练习 1」括号配对

内存限制:512 MiB 时间限制:1000 ms 标准输入输出
题目类型:传统 评测方式:文本比较
上传者: 1bentong
 
 

题目描述

Hecy 又接了个新任务:BE 处理。BE 中有一类被称为 GBE。

以下是 GBE 的定义:

  1. 空表达式是 GBE
  2. 如果表达式 A 是 GBE,则 [A](A) 都是 GBE
  3. 如果 AB 都是 GBE,那么 AB 是 GBE

下面给出一个 BE,求至少添加多少字符能使这个 BE 成为 GBE。

输入格式

输入仅一行,为字符串 BE。

输出格式

输出仅一个整数,表示增加的最少字符数。

样例

样例输入

[])

样例输出

1

数据范围与提示

对于 100%100\%100% 的数据,输入的字符串长度小于 100100100。

 
 
 
 
一道区间dp题,要知道题意。。。
按区间dp套路就好
注意加判断
#include<bits/stdc++.h>
using namespace std;

char a[110];

int f[110][110],n;

int main(){
    scanf("%s",a+1);
    n=strlen(a+1);
    for(int i=1;i<=n;i++) f[i][i]=1;
    for(int len=1;len<n;len++)
        for(int i=1,j=i+len;j<=n;i++,j++){
            f[i][j]=0x3f3f3f3f;//注意这句话只能放这,全部赋极大值会错
            for(int k=i;k<j;k++) f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]);
            if((a[i]=='('&&a[j]==')')||(a[i]=='['&&a[j]==']')) f[i][j]=min(f[i][j],f[i+1][j-1]);
        }
    printf("%d",f[1][n]);
    return 0;
}
View Code

 

posted @ 2019-03-17 17:31  plysc  阅读(385)  评论(0编辑  收藏  举报