【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. Android 经常使用工作命令mmm,mm,m,croot,cgrep,jgrep,resgrep,godir

    官方定义: Invoke ". build/envsetup.sh" from your shell to add the following functions to your ...

  2. m_Orchestrate learning system---二十六、动态给封装好的控件添加属性

    m_Orchestrate learning system---二十六.动态给封装好的控件添加属性 一.总结 一句话总结:比如我现在封装好了ueditor控件,我外部调用这个控件,因为要写数据到数据库 ...

  3. CSS W3SCHOOLS

    https://www.w3schools.com/csS/css3_buttons.asp

  4. SqlServer 删除日志

    1  数据库在使用过程中会使日志文件不断增加,使得数据库的性能下降,并且占用大量的磁盘空间.SQL Server数据库都有log文件,log文件记录用户对数据库修改的操作.可以通过直接删除log文件和 ...

  5. 逻辑学总结x

    逻辑学是研究事实联系: 肯定.否定: 条件 结论: 联系  规则: 的学问.

  6. 运维派 企业面试题1 监控MySQL主从同步是否异常

    Linux运维必会的实战编程笔试题(19题) 企业面试题1:(生产实战案例):监控MySQL主从同步是否异常,如果异常,则发送短信或者邮件给管理员.提示:如果没主从同步环境,可以用下面文本放到文件里读 ...

  7. iOS开发——导入c文件引起的 Unknown type name 'NSString' 错误

    一般情况下出现“Unknown type name”是头文件互相引用出现的,这里不是这个,由于源码使用是c\c++与oc混编,下面三种可以解决问题方案. 解决方案一: 选择所有.c文件,将属性的 id ...

  8. Leaflet绘制多边形

    drawPolygon = () => { let points = []; const polygon = new L.Polygon(points); this.map.addLayer(p ...

  9. node使用express命令报错找不到ejs的解决方法

    首先确定已经全局安装过好几遍express和express-generator,但一使用express命令直接报找不到ejs模块,全局和本地安装ejs都没用,nodemon模块报同样错误,找不到deb ...

  10. caioj 1081 动态规划入门(非常规DP5:观光游览)

    这道题和前面的分组的题有点像 就是枚举最后一组的长度. 然后组数可以在第一层循环也可以在第二层循环 我自己的话就统一一下在第一层循环吧 然后这道题题意我一直没理解清楚,浪费了很多时间,写复杂了 同时初 ...