【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. ftoa浮点型转换成字符串

    #include <stdio.h> bool ftos(float num,char *s,int n) {     int temp; float t=num; int pn=0; b ...

  2. pre自动换行

    从word复制到html中的文本,用pre能够原汁原味的展示出来,但是会出现超过屏蔽界限的情况. 需要进行换行处理. 加上一句css pre { white-space: pre-wrap; word ...

  3. DNS解析污染原理——要么修改包,要么直接丢弃你的网络包

    DNS/域名解析 可以看到dns解析是最初的一步,也是最重要的一步.比如访问亲友,要知道他的正确的住址,才能正确地上门拜访. dns有两种协议,一种是UDP(默认),一种是TCP. udp 方式,先回 ...

  4. ELK搭建(filebeat、elasticsearch、logstash、kibana)

    ELK部署(文章有点儿长,搭建时请到官网将tar包下载好,按步骤可以完成搭建使用) ELK指的是ElasticSearch.LogStash.Kibana三个开源工具 LogStash是负责数据的收集 ...

  5. uwsgi和wsgi

    一个Web应用的本质就是: 浏览器发送一个HTTP请求: 服务器收到请求,生成一个HTML文档: 服务器把HTML文档作为HTTP响应的Body发送给浏览器: 浏览器收到HTTP响应,从HTTP Bo ...

  6. [poj 2912] Rochambeau 解题报告 (带权并查集)

    题目链接:http://poj.org/problem?id=2912 题目: 题目大意: n个人进行m轮剪刀石头布游戏(0<n<=500,0<=m<=2000) 接下来m行形 ...

  7. OLTP 与 OLAP

    OLTP:On-Line Transaction Processing(联机事务处理过程).也称为面向交易的处理过程,其基本特征是前台接收的用户数据可以立即传送到计算中心进行处理,并在很短的时间内给出 ...

  8. 使用ShareSDK分享-图片的链接

    微信中使用ShareSDK分享,需要申请微信开放平台账号,并且以微信中的声明的应用签名打包程序. private void showShare(String url, String title, St ...

  9. win10 的MQTT + apache-apollo服务器使用

    我的使用环境是windows10 2.下载文件目录(注意:开始看教程说直接打开bin目录下的apollo.cmd文件,闪退,原因是没有java_home环境,必须添加java环境): 3.安装好jav ...

  10. Oracle的Clob转换类型

    import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; imp ...