POJ1141 Brackets Sequence---区间DP+输出路径
题目意思就是输入一串括号,让你找到最小的补偿数目使括号串合法,并且输出补全后的串。
基本是区间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+输出路径的更多相关文章
- POJ 1141 Brackets Sequence(区间DP, DP打印路径)
Description We give the following inductive definition of a “regular brackets” sequence: the empty s ...
- 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 ...
- 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 ...
- poj 1141 Brackets Sequence ( 区间dp+输出方案 )
http://blog.csdn.net/cc_again/article/details/10169643 http://blog.csdn.net/lijiecsu/article/details ...
- POJ 题目1141 Brackets Sequence(区间DP记录路径)
Brackets Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 27793 Accepted: 788 ...
- ZOJ1463:Brackets Sequence(间隙DP)
Let us define a regular brackets sequence in the following way: 1. Empty sequence is a regular seque ...
随机推荐
- 28. css样式中px转rem
Vue3:脚手架配置 https://blog.csdn.net/weixin_41424247/article/details/80867351 与原来的vue-cli 2.x版本不同的是:如果使用 ...
- Java基础学习笔记十九 File
IO概述 回想之前写过的程序,数据都是在内存中,一旦程序运行结束,这些数据都没有了,等下次再想使用这些数据,可是已经没有了.那怎么办呢?能不能把运算完的数据都保存下来,下次程序启动的时候,再把这些数据 ...
- super方法 调用父类的方法
描述 super() 函数是用于调用父类(超类)的一个方法. super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO).重复 ...
- IIS多个应用程序共享Session
在应用程序目录下面添加一个Global.asax文件,在文件中添加以下代码: public override void Init() { base.Init(); foreach (string mo ...
- Parallel.ForEach 多线程 声明失败 "未将对象引用设置到对象的实例"
x using System; using System.Collections.Generic; namespace Parallel.ForEach { class Program { //代码结 ...
- 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 ...
- C和C指针小记(十四)-字符串、字符和字节
1.字符串 C语言没有字符串数据类型,因为字符串以字符串常量的形式出现或存储于字符数组中. 字符串常量和适用于那些程序不会对他们进行修改的字符串. 所有其他字符串都必须存储于字符串数组或动态分配的内存 ...
- 分库分表、读写分离——用Sql和ORM(EF)来实现
分库:将海量数据分成多个库保存,比如:2017年的订单库——Order2017,2018年的订单库——Order2018... 分表:水平分表(Order拆成Order1.....12).垂直分表(O ...
- scrollview嵌套tableview
之前写过一次,忘记了, 用的通知 FS
- Fiddler (进阶)内置命令与断点
Fiddler 内置命令与断点 命令 对应请求项 介绍 示例 ? All 问号后边跟一个字符串,可以匹配出包含这个字符串的请求 ?google > Body 大于号后面跟一个数字,可以匹配出请求 ...