【Link】:

【Description】



括号序列由这样的规则生成:

1.空字符是一个括号序列;

2.在括号序列两端加上一对括号也是括号序列;

如(s),[s];

3.两个括号序列A和B,连在一起,也是一个括号序列,即AB也是括号序列

给你一个只包含”()[]”这4种字符的字符串;

让你添加最少的括号,使得所成的序列是一个括号序列;

【Solution】



根据括号序列的生成规则;

设dp[l][r]是,l..r这一段变为合法的括号序列需要添加的括号个数;

dp[i][i] = 1;

如果i和j所在的括号匹配的话;

dp[i][j]=min(dp[i][j],dp[i+1][j−1);

(一开始的时候可以定义dp[i+1][i]=0);

->这个转移对应了在一个括号序列两端再加上一对匹配的括号;

dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j])

k∈[i..j−1]

这个转移对应了两个括号序列连起来;

然后根据dp数组,可以很容易地写出打印方案的程序;

void print(int  i,int j){
看看i..j这一段,是不是根据i和j是一对括号得到的;
是的话putchar(s[i]),print(i+1,j-1),putchar(s[j])然后return;
否则的话,是两个括号序列连起来的;
枚举间断点;
for (int k = i,k <= j-1)
if (dp[i][j] = dp[i][k]+dp[k+1][j]){
print(i,k),print(k+1,j);
return;
}
}

【NumberOf WA】



2



【Reviw】



间断点那里,枚举的时候写错了一点东西.



【Code】

#include <bits/stdc++.h>
using namespace std;
#define Open() freopen("rush.txt","r",stdin)
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--) const int N = 100; char s[N+10];
int dp[N+10][N+10],n; bool check(int i,int j){
if (s[i]=='(' && s[j] == ')') return true;
if (s[i]=='[' && s[j] == ']') return true;
return false;
} void print(int l,int r){
if (l > r) return;
if (l==r){
if (s[l]=='(' || s[l]==')')
printf("()");
else
printf("[]");
return;
}
int ans = dp[l][r];
if (check(l,r) && ans==dp[l+1][r-1]){
putchar(s[l]),print(l+1,r-1),putchar(s[r]);
return;
}
rep1(i,l,r-1)
if (ans==dp[l][i]+dp[i+1][r]){
print(l,i),print(i+1,r);
return;
}
} int main(){
//Open();
int T;
scanf("%d",&T);
getchar();
while (T--){
cin.getline(s+1,N+10);
cin.getline(s+1,N+10);
n = strlen(s+1);
rep1(i,1,n){
dp[i+1][i] = 0;
dp[i][i] = 1;
}
rep2(i,n-1,1){
rep1(j,i+1,n){
dp[i][j] = n;
if (check(i,j)) dp[i][j] = min(dp[i][j],dp[i+1][j-1]);
rep1(k,i,j-1){
dp[i][j] = min(dp[i][j],dp[i][k]+dp[k+1][j]);
}
}
}
print(1,n);
printf("\n");
if (T) printf("\n");
}
return 0;
}

【Uva 1626】Brackets sequence的更多相关文章

  1. UVa 1626 (输出方案) Brackets sequence

    正规括号序列定义为: 空序列是正规括号序列 如果S是正规括号序列,那么[S]和(S)也是正规括号序列 如果A和B都是正规括号序列,则AB也是正规括号序列 输入一个括号序列,添加尽量少的括号使之成为正规 ...

  2. 【HDU 5184】 Brackets (卡特兰数)

    Brackets Problem Description We give the following inductive definition of a “regular brackets” sequ ...

  3. 【巧妙算法系列】【Uva 11464】 - Even Parity 偶数矩阵

    偶数矩阵(Even Parity, UVa 11464) 给你一个n×n的01矩阵(每个元素非0即1),你的任务是把尽量少的0变成1,使得每个元素的上.下.左.右的元素(如果存在的话)之和均为偶数.比 ...

  4. 【贪心+中位数】【UVa 11300】 分金币

    (解方程建模+中位数求最短累积位移) 分金币(Spreading the Wealth, UVa 11300) 圆桌旁坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一 ...

  5. 【LeetCode练习题】Permutation Sequence

    Permutation Sequence The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and ...

  6. 【UVa 10881】Piotr's Ants

    Piotr's Ants Porsition:Uva 10881 白书P9 中文改编题:[T^T][FJUT]第二届新生赛真S题地震了 "One thing is for certain: ...

  7. 【UVa 116】Unidirectional TSP

    [Link]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  8. 【UVa 1347】Tour

    [Link]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  9. 【UVA 437】The Tower of Babylon(记忆化搜索写法)

    [题目链接]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

随机推荐

  1. 微信公众平台开发学习笔记2--获取access token

    access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token.获取的access_token过期时间为2小时.获取access token具体说明请参考官方文档. ...

  2. ubuntu14.04下snort的安装(官方文档安装)(图文详解)

    不多说,直接上干货! 最近为了科研,需要安装和使用Snort. snort的官网 https://www.snort.org/ Snort作为一款优秀的开源主机入侵检测系统,在windows和Linu ...

  3. 基于python3-sklearn,Flask 的回归预测系统

    看到一副图片挺有意思,放在片头 序 "傍晚小街路面上沁出微雨后的湿润,和煦的西风吹来,抬头看看天边的晚霞,嗯明天又是一个好天气.走到水果摊旁,挑了个根蒂蜷缩.敲起来声音浊响的青绿西瓜,一边满 ...

  4. IHttpHandler的学习(0)

    本片文章转自网络 问题1:什么是HttpHandler?(Handler:处理者:那就是对Http请求的处理拉) 问题2:什么是HttpModule? 问题3:什么时候应该使用HttpHandler什 ...

  5. logsource and ALO

    1.首先配置sourcedb上的nfs服务,oggstd上挂载sourcedb的online redo和archive log的目录     oggsource上配置:  vi /etc/export ...

  6. Vue.js小demo

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. Html Input disabled属性

    input的disabled: <input type="text" name="name" placeholder="请输入名称" ...

  8. 四舍五入VS银行家舍入法

    在学习python的时候,遇见了一个颠覆了我传统观念的四舍五入. 看下面,round()的结果和我们以前根深蒂固的四舍五入是不同的. >>> round(0.5) 0 >> ...

  9. CentOS7.3 下开放防火墙的端口

    CentOS 7.3默认使用的是firewall作为防火墙,这里改为iptables防火墙. 1:关闭firewall: systemctl stop firewalld.service system ...

  10. U-boot 启动内核

    1:什么是UBOOT,为什么要有UBOOT? UBOOT的主要作用是用来启动linux内核,因为CPU不能直接从块设备中执行代码,需要把块设备中的程序复制到内存中,而复制之前还需要进行很多初始化工作, ...