UVa 1626 (输出方案) Brackets sequence
正规括号序列定义为:
- 空序列是正规括号序列
- 如果S是正规括号序列,那么[S]和(S)也是正规括号序列
- 如果A和B都是正规括号序列,则AB也是正规括号序列
输入一个括号序列,添加尽量少的括号使之成为正规括号序列,并输出最优方案,多解的话输出任意一个即可。
设d(i, j)表示字符串s[i]~s[j]至少添加的括号的数量,则转移如下:
- S形如[S']或(S'),则转移到d(i+1, j-1)
- 如果S至少有两个字符,将其分为AB,转移到min{d(i, j), d(A) + d(B)}
不管是否满足第一条都要尝试第二种转移,因为[][]可能经过第一条转移到][
打印的时候重新检查一下最优决策。
//#define LOCAL
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int maxn = ;
char s[maxn];
int d[maxn][maxn], n; bool match(char a, char b)
{
return (a == '(' && b == ')') || (a == '[' && b == ']');
} void dp()
{
for (int i = ; i < n; ++i)
{
d[i+][i] = ; //对应空串
d[i][i] = ;
}
for (int i = n-; i >= ; --i)
{
for (int j = i+; j < n; ++j)
{
d[i][j] = n;
if(match(s[i], s[j]))
d[i][j] = min(d[i][j], d[i+][j-]);
for (int k = i; k < j; ++k)
d[i][j] = min(d[i][j], d[i][k] + d[k+][j]);
}
}
} void print(int i, int j)
{
if(i > j) return;
if(i == j)
{
if(s[i] == '(' || s[i] == ')') printf("()");
else printf("[]");
return;
}
int ans = d[i][j];
if(match(s[i], s[j]) && ans == d[i+][j-])
{
printf("%c", s[i]);
print(i+, j-);
printf("%c", s[j]);
return;
}
for (int k = i; k < j; ++k)
{
if(ans == d[i][k] + d[k+][j])
{
print(i, k);
print(k+, j);
return;
}
}
} void readline(char* s)
{
fgets(s, maxn, stdin);
} int main(void)
{
#ifdef LOCAL
freopen("1626in.txt", "r", stdin);
#endif int T;
readline(s);
sscanf(s, "%d", &T);
readline(s);
while(T--)
{
readline(s);
n = strlen(s) - ; //去掉最后的换行符
memset(d, -, sizeof(d));
dp();
print(, n-);
puts("");
if(T) puts("");
readline(s);
} return ;
}
代码君
UVa 1626 (输出方案) Brackets sequence的更多相关文章
- 【Uva 1626】Brackets sequence
[Link]: [Description] 括号序列由这样的规则生成: 1.空字符是一个括号序列; 2.在括号序列两端加上一对括号也是括号序列; 如(s),[s]; 3.两个括号序列A和B,连在一起, ...
- 1626 - Brackets sequence——[动态规划]
Let us define a regular brackets sequence in the following way: Empty sequence is a regular sequence ...
- [poj P1141] Brackets Sequence
[poj P1141] Brackets Sequence Time Limit: 1000MS Memory Limit: 65536K Special Judge Description ...
- POJ 题目1141 Brackets Sequence(区间DP记录路径)
Brackets Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 27793 Accepted: 788 ...
- POJ 1141 Brackets Sequence
Brackets Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 29502 Accepted: 840 ...
- POJ1141 Brackets Sequence
Description Let us define a regular brackets sequence in the following way: 1. Empty sequence is a r ...
- 记忆化搜索(DP+DFS) URAL 1183 Brackets Sequence
题目传送门 /* 记忆化搜索(DP+DFS):dp[i][j] 表示第i到第j个字符,最少要加多少个括号 dp[x][x] = 1 一定要加一个括号:dp[x][y] = 0, x > y; 当 ...
- UVA 1546 - Complete the sequence!(差分法)
UVA 1546 - Complete the sequence! 题目链接 题意:给定多项式前s项,求出后c项,要求尽量小 思路:利用差分法,对原序列求s - 1次差分,就能够发现规律,然后对于每多 ...
- ZOJ1463:Brackets Sequence(间隙DP)
Let us define a regular brackets sequence in the following way: 1. Empty sequence is a regular seque ...
随机推荐
- redis 数据库维护之 key 大小获取
获得 redis key 大小 redis 用过一段时间后,发现一个KEY每天需更新值,但总是更新不全,故此为了定位问题,整理此脚本,辅助监控一下 写了两个脚本 注意:需要提前从 https://gi ...
- Node.js NPM国内镜像
NPM国内镜像 http://npm.hacknodejs.com/ http://registry.npmjs.vitecho.com/ https://registry.npm.taobao.or ...
- POJ3525 Most Distant Point from the Sea(半平面交)
给你一个凸多边形,问在里面距离凸边形最远的点. 方法就是二分这个距离,然后将对应的半平面沿着法向平移这个距离,然后判断是否交集为空,为空说明这个距离太大了,否则太小了,二分即可. #pragma wa ...
- lightoj 1408 Batting Practice (概率问题,求期望,推公式)
题意:一个人若连续进k1个球或连续不进k2个球,游戏结束,给出这个人不进球的概率p(注意:是不进球!!!),求到游戏结束时这个投球个数的期望. 不进球概率为p,进概率 q=1-p.设 f[i] 表示连 ...
- 概述Log4j简介
在强调可重用组件开发的今天,除了自己从头到尾开发一个可重用的日志操作类外,Apache为我们提供了一个强有力的日志操作包-Log4j. Log4j是Apache的一个开放源代码项目,通过使用Log4j ...
- C#打开得到路径
FolderBrowserDialog path = new FolderBrowserDialog(); path.ShowDialog(); MessageBox.Show(path.Select ...
- linux环境几个特殊的shell变量
特殊的shell变量: $0 获取当前执行的shell脚本的文件名 $n 获取当前执行的shell脚本的第n个参数值,n=1..9 $* 获取当前shell的所有参数 “$1 $2 $3 …注意 ...
- Spring框架学习之第9节
aop编程 aop(aspect oriented programming)面向切面(方面)编程,是所有对象或者是一类对象编程,核心是(在不增加代码的基础上,还增加新功能) 汇编(伪机器指令 mov ...
- 修改bigbluebutton白板上传中文乱码
中文命名的文档,上传是乱码 -- 显示的 打开后, 中文部分是乱码 Comment 1 by project member ffdixon, Nov 08, 2010 Translatio ...
- servlet实现文件下载
之前没怎么用过这个,这次项目中用到了,于是总结一下: 应该说主要注意三方面: 1.写一个servlet 2.在web.xml中配置这个servlet 3.页面上调用这个servlet 第一: 写 ...