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

  基本是区间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. 28. css样式中px转rem

    Vue3:脚手架配置 https://blog.csdn.net/weixin_41424247/article/details/80867351 与原来的vue-cli 2.x版本不同的是:如果使用 ...

  2. Java基础学习笔记十九 File

    IO概述 回想之前写过的程序,数据都是在内存中,一旦程序运行结束,这些数据都没有了,等下次再想使用这些数据,可是已经没有了.那怎么办呢?能不能把运算完的数据都保存下来,下次程序启动的时候,再把这些数据 ...

  3. super方法 调用父类的方法

    描述 super() 函数是用于调用父类(超类)的一个方法. super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO).重复 ...

  4. IIS多个应用程序共享Session

    在应用程序目录下面添加一个Global.asax文件,在文件中添加以下代码: public override void Init() { base.Init(); foreach (string mo ...

  5. Parallel.ForEach 多线程 声明失败 "未将对象引用设置到对象的实例"

    x using System; using System.Collections.Generic; namespace Parallel.ForEach { class Program { //代码结 ...

  6. Gym 101194E / UVALive 7901 - Ice Cream Tower - [数学+long double][2016 EC-Final Problem E]

    题目链接: http://codeforces.com/gym/101194/attachments https://icpcarchive.ecs.baylor.edu/index.php?opti ...

  7. C和C指针小记(十四)-字符串、字符和字节

    1.字符串 C语言没有字符串数据类型,因为字符串以字符串常量的形式出现或存储于字符数组中. 字符串常量和适用于那些程序不会对他们进行修改的字符串. 所有其他字符串都必须存储于字符串数组或动态分配的内存 ...

  8. 分库分表、读写分离——用Sql和ORM(EF)来实现

    分库:将海量数据分成多个库保存,比如:2017年的订单库——Order2017,2018年的订单库——Order2018... 分表:水平分表(Order拆成Order1.....12).垂直分表(O ...

  9. scrollview嵌套tableview

    之前写过一次,忘记了, 用的通知 FS

  10. Fiddler (进阶)内置命令与断点

    Fiddler 内置命令与断点 命令 对应请求项 介绍 示例 ? All 问号后边跟一个字符串,可以匹配出包含这个字符串的请求 ?google > Body 大于号后面跟一个数字,可以匹配出请求 ...