【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. 6.5.2 C# 中的函数组合

    6.5.2 C# 中的函数组合 C# 中的函数组合是可能的.但使用非常有限,这是部分是由于在 C# 中散应用不能非常easy使用.但更重要的是,由于大多数操作是用成员来写的.而不是函数.但我们至少能够 ...

  2. glm编译错误问题解决 formal parameter with __declspec(align(&#39;16&#39;)) won&#39;t be aligned

    參考:http://stackoverflow.com/questions/25300116/directxxmmatrix-error-c2719-declspecalign16-wont-be-a ...

  3. 数据可视化之Processing【1】

    说Processing之前得先说一下数据可视化. 数据可视化--顾名思义.是关于数据之视觉表现形式的研究,将数据用其它方式表现出来,使之更直观, 更清晰,更easy分析和处理.常见的表达方式如word ...

  4. hdu1978 How many ways

    How many ways Problem Description 这是一个简单的生存游戏,你控制一个机器人从一个棋盘的起始点(1,1)走到棋盘的终点(n,m).游戏的规则描述如下: 机器人一开始在棋 ...

  5. java9新特性-20-Javascript引擎升级:Nashorn

    1.官方Feature 236: Parser API for Nashorn 292: Implement Selected ECMAScript 6 Features in Nashorn 2.使 ...

  6. 洛谷P3195 [HNOI2008]玩具装箱TOY(单调队列优化DP)

    题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具, ...

  7. vue中使用滚动效果

    new Vue({ el: '#app', data: function data() { return { bottom: false, beers: [] }; }, watch: { botto ...

  8. Oracle 流程控制语句

    分为选择语句循环语句两大类:一 选择语句1 if then ...end;set serveroutput on declare var_name1 varchar2(50):='East'; var ...

  9. 重复执行shell脚本。

    while ((1)); do gclient runhooks; sleep 2; donewhile ((1)); do ifconfig; sleep 1; done

  10. Nginx的编译与安装

    nginx.org 下载最新版本[选择 stable 稳定版]. 安装步骤: 1.cd /usr/local/src/ 2.wget http://nginx.org/download/nginx-1 ...