UVA1626 - Brackets sequence(区间DP--括号匹配+递归打印)
题目描写叙述:
定义合法的括号序列例如以下:
1 空序列是一个合法的序列
2 假设S是合法的序列。则(S)和[S]也是合法的序列
3 假设A和B是合法的序列。则AB也是合法的序列
比如:以下的都是合法的括号序列
(), [], (()), ([]), ()[], ()[()]
以下的都是非法的括号序列
(, [, ), )(, ([)], ([(]
给定一个由'(', ')', '[', 和 ']' 组成的序列,找出以该序列为子序列的最短合法序列。
思路:真是经典的题目。区间DP。题目竟然有陷阱,输入可能是空串,所以用scanf的时候,会不读入,就少了一次读入,wa
所以用gets
// Accepted C++ 1.002 2015-03-12 13:34:47
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int inf= 0x3f3f3f3f;
int dp[105][105];
char str[105];
int n; bool match(char a,char b)
{
if(a=='('&&b==')') return true;
else if(a=='[' && b==']') return true;
return false;
}
void print(int l,int r) //递归打印解
{
if(l>r) return ;
if(l==r)
{
if(str[l]=='('||str[l]==')') printf("()");
else if(str[l]=='['||str[l]==']') printf("[]");
return ;
}
if(match(str[l],str[r])&&dp[l][r]==dp[l+1][r-1])
//别忘了match(str[l],str[r]),由于dp[l][r]==dp[l+1][r-1]时候,不一定外側括号匹配,非常easy错
{
putchar(str[l]);
print(l+1,r-1);
putchar(str[r]);
return ;
}
for(int k=l;k<r;k++)
if(dp[l][r]==dp[l][k]+dp[k+1][r])
{
print(l,k);
print(k+1,r);
return;
}
}
int main()
{
int T;
scanf("%d",&T);
getchar();//吃掉T之后的换行
while(T--)
{
getchar(); //每一个输入前都有一个空行
gets(str+1);
n=strlen(str+1);
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++) dp[i][i]=1; //边界
for(int l=1;l<n;l++)
for(int p=1;p+l<=n;p++)
{
dp[p][p+l] = inf ;
if(match(str[p],str[p+l])) dp[p][p+l]=dp[p+1][p+l-1];
for(int k=p ; k<p+l ;k++)
dp[p][p+l]=min(dp[p][p+l],dp[p][k]+dp[k+1][p+l]);
}
if(n) print(1,n);
puts("");
if(T) putchar('\n'); //输出之间要输出空行
}
return 0;
}
UVA1626 - Brackets sequence(区间DP--括号匹配+递归打印)的更多相关文章
- 区间dp 括号匹配问题
这道题目能用区间dp来解决,是因为一个大区间的括号匹配数是可以由小区间最优化选取得到(也就是满足最优子结构) 然后构造dp 既然是区间类型的dp 一般用二维 我们定义dp[i][j] 表示i~j这个区 ...
- poj 2955 Brackets (区间dp 括号匹配)
Description We give the following inductive definition of a “regular brackets” sequence: the empty s ...
- 区间dp - 括号匹配并输出方案
Let us define a regular brackets sequence in the following way: 1. Empty sequence is a regular seque ...
- poj 1141 Brackets Sequence 区间dp,分块记录
Brackets Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 35049 Accepted: 101 ...
- [原]POJ1141 Brackets Sequence (dp动态规划,递归)
本文出自:http://blog.csdn.net/svitter 原题:http://poj.org/problem?id=1141 题意:输出添加括号最少,并且使其匹配的串. 题解: dp [ i ...
- POJ 1141 Brackets Sequence(区间DP, DP打印路径)
Description We give the following inductive definition of a “regular brackets” sequence: the empty s ...
- UVA 1626 Brackets sequence 区间DP
题意:给定一个括号序列,将它变成匹配的括号序列,可能多种答案任意输出一组即可.注意:输入可能是空串. 思路:D[i][j]表示区间[i, j]至少需要匹配的括号数,转移方程D[i][j] = min( ...
- Ural 1183 Brackets Sequence(区间DP+记忆化搜索)
题目地址:Ural 1183 最终把这题给A了.. .拖拉了好长时间,.. 自己想还是想不出来,正好紫书上有这题. d[i][j]为输入序列从下标i到下标j最少须要加多少括号才干成为合法序列.0< ...
- poj 1141 Brackets Sequence (区间dp)
题目链接:http://poj.org/problem?id=1141 题解:求已知子串最短的括号完备的全序列 代码: #include<iostream> #include<cst ...
随机推荐
- typedef struct LNode命名结构指针(线性表的链式存储)
一.typedef 关键字 1. 简介: typedef工具是一个高级数据特性,利用typedef可以为某一些类型自定义名称. 2. 工作原理: 例如我们定义链表的存储结构时,需要定义结点的存储数据元 ...
- Linux profile1,bashrc,.bash_profile,.bash_login,.profile,.bashrc,.bash_logout浅析 Part1
profile,bashrc,.bash_profile,.bash_login,.profile,.bashrc,.bash_logout浅析 Part 1 by:授客 QQ:103355312 ...
- 程序员简单打造一个灵活智能的自动化运维系统C#实例程序
你是一个程序员,被派去管理公司500台计算机.这些机器可能需要执行一些自动化任务,一台台手动操作会把你累死.重复性的工作还是交给电脑处理,怎么解决这个问题呢?一个自动化的运维系统是必须的.自己实现的好 ...
- 简述 Spring Cloud 是什么1
很多同学都了解了Spring ,了解了 Spring Boot, 但对于 Spring Cloud 是什么还是比较懵逼的. 本文带你简单的了解下,什么是Spring Cloud. Spring Clo ...
- Java——语句
空语句: ; 符合语句:{} if语句:if () {} else {} break 语句:跳出单层循环 循环语句:for(;;){} do{}while()
- 洗礼灵魂,修炼python(28)--异常处理(2)—>运用异常
你可能会想,卧槽这标题取的,前面不是说异常就是报错吗?异常还能运用? 是的,异常确实可以运用,可以刻意制造异常,在出现异常时捕获异常并对异常处理,所以进入本篇博文的话题—异常处理 异常处理: 异常处理 ...
- Excel函数进阶
#笔记:为了方便自己以后查找,以便随时随地能查看.形成系统化学习! 查找引用函数 ------------------包含----------Vlookup函数(if数组).Hlookup函数.loo ...
- python第十八天
学习内容: json 模块,pickle模块,shelve模块,xml模块 json 模块 序列化: import json,pickle info={ 'name':'a', 'age':34, ...
- Linux regulator framework(1) - 概述【转】
转自蜗窝科技:http://www.wowotech.net/pm_subsystem/regulator_framework_overview.html 1. 前言 Regulator,中文名翻译为 ...
- Django电商项目---完成登录验证和用户中心(个人信息)day3
登录验证的实现 背景说明: 用户在商品界面选择商品后,在点击购物车或者结算订单之前 需要完成用户的登录验证,这里用装饰器来完成 创建装饰器类: df_user/user_decorator.py ...