Ural 1183 Brackets Sequence(区间DP+记忆化搜索)
题目地址:Ural 1183
最终把这题给A了。。
。拖拉了好长时间,。。
自己想还是想不出来,正好紫书上有这题。
d[i][j]为输入序列从下标i到下标j最少须要加多少括号才干成为合法序列。0<=i<=j<len (len为输入序列的长度)。
c[i][j]为输入序列从下标i到下标j的断开位置。假设没有断开则为-1。
当i==j时。d[i][j]为1
当s[i]=='(' && s[j]==')' 或者 s[i]=='[' && s[j]==']'时,d[i][j]=d[i+1][j-1]
否则d[i][j]=min{d[i][k]+d[k+1][j]} i<=k<j , c[i][j]记录断开的位置k
採用递推方式计算d[i][j]
输出结果时採用递归方式输出print(0, len-1)
输出函数定义为print(int i, int j),表示输出从下标i到下标j的合法序列
当i>j时。直接返回,不须要输出
当i==j时。d[i][j]为1,至少要加一个括号。假设s[i]为'(' 或者')'。输出"()",否则输出"[]"
当i>j时,假设c[i][j]>=0。说明从i到j断开了。则递归调用print(i, c[i][j]);和print(c[i][j]+1, j);
假设c[i][j]<0,说明没有断开。假设s[i]=='(' 则输出'('、 print(i+1, j-1); 和")"
否则输出"[" print(i+1, j-1);和"]"
代码例如以下:
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <queue>
#include <map>
#include <set>
#include <algorithm> using namespace std;
#define LL __int64
const int INF=0x3f3f3f3f;
char s[200];
int dp[110][110], tag[110][110];
int match(char c1, char c2)
{
if((c1=='('&&c2==')')||(c1=='['&&c2==']'))
return 1;
return 0;
}
void print(int l, int r)
{
if(l>r) return ;
if(l==r)
{
if(s[l]=='('||s[l]==')')
printf("()");
else
printf("[]");
}
else if(tag[l][r]==-1)
{
printf("%c",s[l]);
print(l+1,r-1);
printf("%c",s[r]);
}
else
{
print(l,tag[l][r]);
print(tag[l][r]+1,r);
}
}
int main()
{
int n, m, i, j, len, k;
gets(s);
len=strlen(s);
if(len==0)
{
puts("");
}
memset(dp,INF,sizeof(dp));
memset(tag,-1,sizeof(tag));
for(i=0;i<len;i++)
{
dp[i][i]=1;
dp[i+1][i]=0;
}
for(i=len-2;i>=0;i--)
{
for(j=i+1;j<len;j++)
{
dp[i][j]=len+1;
if(match(s[i],s[j]))
{
dp[i][j]=min(dp[i][j],dp[i+1][j-1]);
}
for(k=i;k<=j;k++)
{
if(dp[i][j]>dp[i][k]+dp[k+1][j])
{
dp[i][j]=dp[i][k]+dp[k+1][j];
tag[i][j]=k;
}
}
}
}
//printf("%d\n",dp[0][len-1]);
/*for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
printf("%d ",tag[i][j]);
}
puts("");
}*/
print(0,len-1);
puts("");
return 0;
}
Ural 1183 Brackets Sequence(区间DP+记忆化搜索)的更多相关文章
- (区间dp + 记忆化搜索)Treats for the Cows (POJ 3186)
http://poj.org/problem?id=3186 Description FJ has purchased N (1 <= N <= 2000) yummy treats ...
- UVA 10003 Cutting Sticks 区间DP+记忆化搜索
UVA 10003 Cutting Sticks+区间DP 纵有疾风起 题目大意 有一个长为L的木棍,木棍中间有n个切点.每次切割的费用为当前木棍的长度.求切割木棍的最小费用 输入输出 第一行是木棍的 ...
- uva 10891 区间dp+记忆化搜索
https://vjudge.net/problem/UVA-10891 给定一个序列x,A和B依次取数,规则是每次只能从头或者尾部取走若干个数,A和B采取的策略使得自己取出的数尽量和最大,A是先手, ...
- URAL 1183 Brackets Sequence(DP)
题目链接 题意 : 给你一串由括号组成的串,让你添加最少的括号使该串匹配. 思路 : 黑书上的DP.dp[i][j] = min{dp[i+1][j-1] (sh[i] == sh[j]),dp[i] ...
- loj 1031(区间dp+记忆化搜索)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1031 思路:dp[i][j]表示从区间i-j中能取得的最大值,然后就是枚举分割点了. ...
- BZOJ1055[HAOI2008]玩具取名 【区间dp + 记忆化搜索】
题目 某人有一套玩具,并想法给玩具命名.首先他选择WING四个字母中的任意一个字母作为玩具的基本名字.然后 他会根据自己的喜好,将名字中任意一个字母用“WING”中任意两个字母代替,使得自己的名字能够 ...
- HDU 2517 / POJ 1191 棋盘分割 区间DP / 记忆化搜索
题目链接: 黑书 P116 HDU 2157 棋盘分割 POJ 1191 棋盘分割 分析: 枚举所有可能的切割方法. 但如果用递归的方法要加上记忆搜索, 不能会超时... 代码: #include& ...
- hdu 4597 Play Game(区间dp,记忆化搜索)
Problem Description Alice and Bob are playing a game. There are two piles of cards. There are N card ...
- poj 1088 滑雪(区间dp+记忆化搜索)
题目链接:http://poj.org/problem?id=1088 思路分析: 1>状态定义:状态dp[i][j]表示在位置map[i][j]可以滑雪的最长区域长度: 2>状态转移方程 ...
随机推荐
- Docker for Windows(三)Docker镜像与容器的区别&常用命令
Docker镜像(Image)是一堆只读文件(read-only layer),容器(container)的定义和镜像(image)几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是 ...
- Vmware搭建LNMP环境(Centos7+Nginx+Mysql+PHP7.1.8)
参考:1.Linux学习之CentOS(一)----在VMware虚拟机中安装CentOS 7(图文教程) 2.Centos7搭建LNMP环境 3.MySQL5.7修改默认root密码 4.CentO ...
- css过渡笔记
3D http://fangyexu.com/tool-CSS3Inspector.html <!DOCTYPE html> <html lang="en" ...
- python之函数的参数
1.位置参数: 例如计算一个整数的平方: def power(x) return x * x 显然参数x就是一个位置参数,如果要是计算5*5*5..............*5 ,这个函数就太麻烦了, ...
- 使用 Leaflet 显示 ArcGIS 生成西安80坐标的地图缓存
Leaflet 是一个非常小巧灵活的 Geo js 库,esri 本身也在 Github 上有 leaflet 的相关项目.但是 leaflet 本身支持 Web Mercator Auxiliary ...
- vip会员统计表 (vip等级是灵活配置的 非写死1是金卡用户 2是什么 等)
一个非常常见的报表,分析会员组成比例 以及最新增长情况 和上月同期会员增长情况. 比较特殊一点的是 报表中的 普通会员 和 金卡会员 临时会员 银卡会员 等列 都是根据会员等级配置表动态生成的(即 ...
- ORACLE EXPDP命令使用详细
相关参数以及导出示例: 1. DIRECTORY 指定转储文件和日志文件所在的目录DIRECTORY=directory_objectDirectory_object用于指定目录对象名称.需要注意,目 ...
- redis介绍(5)主从复制
redis的主从复制: 主从复制介绍:redis的主从复制情况下,一个master节点下可以有多个slave节点,而且每个slave节点又可以有很多slave节点,形成很大的集群量级,我简单画个图,如 ...
- DROP语句总结
一.基本语句 通过使用 DROP 语句,可以轻松地删除索引.表和数据库. 1.DROP INDEX 语句 DROP INDEX 语句用于删除表中的索引. <!--用于 MS Access 的 ...
- Oracle EBS AP 已经完全付款的发票仍然可以选择并进行零金额的付款
1>找出相应的发票; SELECT DISTINCT ai.invoice_id, ai.invoice_num invoice_num, pv.segment1 vendor_num, pv. ...