题目地址: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+记忆化搜索)的更多相关文章

  1. (区间dp + 记忆化搜索)Treats for the Cows (POJ 3186)

    http://poj.org/problem?id=3186   Description FJ has purchased N (1 <= N <= 2000) yummy treats ...

  2. UVA 10003 Cutting Sticks 区间DP+记忆化搜索

    UVA 10003 Cutting Sticks+区间DP 纵有疾风起 题目大意 有一个长为L的木棍,木棍中间有n个切点.每次切割的费用为当前木棍的长度.求切割木棍的最小费用 输入输出 第一行是木棍的 ...

  3. uva 10891 区间dp+记忆化搜索

    https://vjudge.net/problem/UVA-10891 给定一个序列x,A和B依次取数,规则是每次只能从头或者尾部取走若干个数,A和B采取的策略使得自己取出的数尽量和最大,A是先手, ...

  4. URAL 1183 Brackets Sequence(DP)

    题目链接 题意 : 给你一串由括号组成的串,让你添加最少的括号使该串匹配. 思路 : 黑书上的DP.dp[i][j] = min{dp[i+1][j-1] (sh[i] == sh[j]),dp[i] ...

  5. loj 1031(区间dp+记忆化搜索)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1031 思路:dp[i][j]表示从区间i-j中能取得的最大值,然后就是枚举分割点了. ...

  6. BZOJ1055[HAOI2008]玩具取名 【区间dp + 记忆化搜索】

    题目 某人有一套玩具,并想法给玩具命名.首先他选择WING四个字母中的任意一个字母作为玩具的基本名字.然后 他会根据自己的喜好,将名字中任意一个字母用“WING”中任意两个字母代替,使得自己的名字能够 ...

  7. HDU 2517 / POJ 1191 棋盘分割 区间DP / 记忆化搜索

    题目链接: 黑书 P116 HDU 2157 棋盘分割 POJ 1191 棋盘分割 分析:  枚举所有可能的切割方法. 但如果用递归的方法要加上记忆搜索, 不能会超时... 代码: #include& ...

  8. hdu 4597 Play Game(区间dp,记忆化搜索)

    Problem Description Alice and Bob are playing a game. There are two piles of cards. There are N card ...

  9. poj 1088 滑雪(区间dp+记忆化搜索)

    题目链接:http://poj.org/problem?id=1088 思路分析: 1>状态定义:状态dp[i][j]表示在位置map[i][j]可以滑雪的最长区域长度: 2>状态转移方程 ...

随机推荐

  1. Docker for Windows(三)Docker镜像与容器的区别&常用命令

    Docker镜像(Image)是一堆只读文件(read-only layer),容器(container)的定义和镜像(image)几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是 ...

  2. Vmware搭建LNMP环境(Centos7+Nginx+Mysql+PHP7.1.8)

    参考:1.Linux学习之CentOS(一)----在VMware虚拟机中安装CentOS 7(图文教程) 2.Centos7搭建LNMP环境 3.MySQL5.7修改默认root密码 4.CentO ...

  3. css过渡笔记

    3D     http://fangyexu.com/tool-CSS3Inspector.html <!DOCTYPE html> <html lang="en" ...

  4. python之函数的参数

    1.位置参数: 例如计算一个整数的平方: def power(x) return x * x 显然参数x就是一个位置参数,如果要是计算5*5*5..............*5 ,这个函数就太麻烦了, ...

  5. 使用 Leaflet 显示 ArcGIS 生成西安80坐标的地图缓存

    Leaflet 是一个非常小巧灵活的 Geo js 库,esri 本身也在 Github 上有 leaflet 的相关项目.但是 leaflet 本身支持 Web Mercator Auxiliary ...

  6. vip会员统计表 (vip等级是灵活配置的 非写死1是金卡用户 2是什么 等)

      一个非常常见的报表,分析会员组成比例 以及最新增长情况 和上月同期会员增长情况. 比较特殊一点的是 报表中的 普通会员 和 金卡会员 临时会员 银卡会员 等列 都是根据会员等级配置表动态生成的(即 ...

  7. ORACLE EXPDP命令使用详细

    相关参数以及导出示例: 1. DIRECTORY 指定转储文件和日志文件所在的目录DIRECTORY=directory_objectDirectory_object用于指定目录对象名称.需要注意,目 ...

  8. redis介绍(5)主从复制

    redis的主从复制: 主从复制介绍:redis的主从复制情况下,一个master节点下可以有多个slave节点,而且每个slave节点又可以有很多slave节点,形成很大的集群量级,我简单画个图,如 ...

  9. DROP语句总结

    一.基本语句 通过使用 DROP 语句,可以轻松地删除索引.表和数据库.  1.DROP INDEX 语句 DROP INDEX 语句用于删除表中的索引. <!--用于 MS Access 的 ...

  10. Oracle EBS AP 已经完全付款的发票仍然可以选择并进行零金额的付款

    1>找出相应的发票; SELECT DISTINCT ai.invoice_id, ai.invoice_num invoice_num, pv.segment1 vendor_num, pv. ...