题目意思就是输入一串括号,让你找到最小的补偿数目使括号串合法,并且输出补全后的串。

  基本是区间DP的模板题,该题特别让你输出补全后的答案。这和区间dp的反向思路很像,就是把一个大的区间划分为多个互不干扰的区间来输出。划分到需要补充的点时,就直接补充。

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
using namespace std;
int n,k,s,dp[][];
char a[];
const long long LNF = 0x3f3f3f3f3f3f;
bool pd(int i,int j)//判断a[i]和a[j]是否为一对括号
{
if(a[i]=='('&&a[j]==')') return true;
if(a[i]=='['&&a[j]==']') return true;
return false;
}
void pr(int i,int j)//输出区间[i,j]的补全版本
{
if(i>j) return;
if(i==j) //递归到了一个点上时,直接输出补全后的一对括号
{
if(a[i]=='('||a[i]==')') printf("()");
else printf("[]");
return;
}
int m=dp[i][j];
if(pd(i,j)&&m==dp[i+][j-]) //如果成立,意味着a[i]和a[j]是一对匹配的括号
{
printf("%c",a[i]);
pr(i+,j-);
printf("%c",a[j]);
return;
}
for(int k=i;k<j;k++)
{
if(m==dp[i][k]+dp[k+][j])
{
pr(i,k);
pr(k+,j);
return ;//满足条件就代表找到了一个分割点,可以划分成两个独立区间的输出。
}
}
}
int main()
{
while(gets(a))
{
int n=strlen(a);
memset(dp,LNF,sizeof(dp));
for(int i=;i<n;i++) dp[i][i]=,dp[i+][i]=; //单个符号需要补一个括号才能补全 无符号则本身就合法
for(int i=n-;i>=;i--) //从后往前更新,保证每次遍历只修改之前的状态一次
for(int j=i+;j<=n-;j++)
{
dp[i][j]=LNF;
if(pd(i,j)) dp[i][j]=dp[i+][j-];
for(int k=i;k<j;k++) dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+][j]);
// cout<<dp[i][j]<<endl;
}
pr(,n-);
printf("\n"); }
}

POJ1141 Brackets Sequence---区间DP+输出路径的更多相关文章

  1. POJ 1141 Brackets Sequence(区间DP, DP打印路径)

    Description We give the following inductive definition of a “regular brackets” sequence: the empty s ...

  2. poj 1141 Brackets Sequence 区间dp,分块记录

    Brackets Sequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 35049   Accepted: 101 ...

  3. [原]POJ1141 Brackets Sequence (dp动态规划,递归)

    本文出自:http://blog.csdn.net/svitter 原题:http://poj.org/problem?id=1141 题意:输出添加括号最少,并且使其匹配的串. 题解: dp [ i ...

  4. UVA 1626 Brackets sequence 区间DP

    题意:给定一个括号序列,将它变成匹配的括号序列,可能多种答案任意输出一组即可.注意:输入可能是空串. 思路:D[i][j]表示区间[i, j]至少需要匹配的括号数,转移方程D[i][j] = min( ...

  5. Ural 1183 Brackets Sequence(区间DP+记忆化搜索)

    题目地址:Ural 1183 最终把这题给A了.. .拖拉了好长时间,.. 自己想还是想不出来,正好紫书上有这题. d[i][j]为输入序列从下标i到下标j最少须要加多少括号才干成为合法序列.0< ...

  6. poj 1141 Brackets Sequence (区间dp)

    题目链接:http://poj.org/problem?id=1141 题解:求已知子串最短的括号完备的全序列 代码: #include<iostream> #include<cst ...

  7. poj 1141 Brackets Sequence ( 区间dp+输出方案 )

    http://blog.csdn.net/cc_again/article/details/10169643 http://blog.csdn.net/lijiecsu/article/details ...

  8. POJ 题目1141 Brackets Sequence(区间DP记录路径)

    Brackets Sequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 27793   Accepted: 788 ...

  9. ZOJ1463:Brackets Sequence(间隙DP)

    Let us define a regular brackets sequence in the following way: 1. Empty sequence is a regular seque ...

随机推荐

  1. nginx配置https访问

    一.准备 环境:centos6.8 nginx:1.13.6 二.开始       首先安装依赖包: yum install -y gcc gcc-c++ autoconf automake make ...

  2. python语法_字符类型

    str(string): 字符串   str(被转换的数据) int(interger):整数   int(被转换的数据)

  3. Dijkstra模板

    Dijkstra struct node { long long x,d; node(); node(long long xx,long long dd){ x = xx; d = dd; } }; ...

  4. Compile caffe on unbutu 16.0.4

    1. apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhd ...

  5. 项目实战:负载均衡集群企业级应用实战—LVS详解

    目录 一.负载均衡集群介绍 二.lvs 的介绍 三.LVS负载均衡四种工作模式 1.NAT工作模式 2.DR工作模式 3.TUN工作模式 4.full-nat 工作模式 5.四者的区别 四.LVS i ...

  6. 前端模板 artTemplate之辅助方法template.helper

    var labelMap = { onlinePayment:{ label:"在线支付", desc:"支持大部分储蓄卡.信用卡及第三方平台支付", name ...

  7. 【Python全栈-后端开发】Django进阶2-Form表单

    Django进阶2-Form表单 Django的Form主要具有一下几大功能: 生成HTML标签(可以保留上次输入内容) 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页 ...

  8. 常见web UI 元素操作 及API使用

    1. 链接(Link) // 找到链接元素,这个方法比较直接,即通过超文本链接上的文字信息来定位元素,这种方式一般专门用于定位页面上的超文本链接 WebElement link1 = driver.f ...

  9. 苹果cms安装及配置详细教程

    听说这个好!php+mysql的 下载 http://www.maccms.com/down.html 下载之后解压到你的网站跟目录中,就像这个样子的   后台目录 然后重要的一步来了,在ftp工具上 ...

  10. java之xml解析-dom4j

    解析方式 XML 解析方式有很多种,但是常用的有两种,如下: DOM Document Object Model:把整个 XML 读到内存中,形成树状结构.整个文档为 Document 对象,属性为 ...