题目链接:Brackets Sequence





题目描写叙述:给出一串由‘(‘)’‘ [ ' ' ] '组成的串,让你输出加入最少括号之后使得括号匹配的串。





分析:是区间dp的经典模型括号匹配。解说:http://blog.csdn.net/y990041769/article/details/24194605 ,难点在于要把匹配后的括号输出来。

首先我们知道前面定义dp [ i ] [ j ] 为串中第 i 个到第 j 个括号的最大匹配数目

那么假如我们知道随意 i 到 j 从哪儿插入分点使得匹配加入括号最少。

那么我们定义pos【i】【j】表示 i 到 j 从哪儿分开使得匹配加入括号最少,假设i和j匹配我们能够让pos【i】【j】=-1;

我们发如今我们之前更新dp [ i ] [ j ] 的时候假设中间点k使得if ( dp [ i ] [ k ] + dp [ k+1 ] [ j ] >= dp [ i ] [ j ] ) 。那么我们从k分开能够让加入的括号最少。

可是还要注意一点,考虑全部的都不匹配如“((((”这类。考虑怎么处理,然后就能够递归输出结果。

这题目坑了我非常多次,刚開始Tel,发现所有不匹配不能处理。改了之后wa了。发现输入“()(()”。输出的是“(()()())”,明显错误,是在处理的时候没处理好,最后注意输入会有空串。

代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 120;
int dp[N][N],pos[N][N]; ///i到j从哪个位置分开加入的括号数最少
char s[N];
void show(int i,int j)
{
if(i>j) return;
if(i==j)
{
if(s[i]=='('||s[i]==')') cout<<"()";
else cout<<"[]";
}
else
{
if(pos[i][j]==-1)
{
cout<<s[i];
show(i+1,j-1);
cout<<s[j];
}
else
{
show(i,pos[i][j]);
show(pos[i][j]+1,j);
}
}
}
int main()
{
while(gets(s))
{
memset(dp,0,sizeof(dp));
int len=strlen(s);
for(int i=1; i<len; i++)
{
for(int j=0,k=i; k<len; j++,k++)
{
if(s[j]=='('&&s[k]==')' || s[j]=='['&&s[k]==']')
{
dp[j][k]=dp[j+1][k-1]+2;
pos[j][k]=-1;
}
for(int f=j; f<k; f++)
{
if(dp[j][f]+dp[f+1][k]>=dp[j][k]) ///注意这里 保证全部都不匹配也可以分
{
dp[j][k]=dp[j][f]+dp[f+1][k];
pos[j][k]=f;
}
}
}
}
//cout<<s.size()-dp[0][s.size()-1]<<endl;
show(0,len-1);cout<<endl;
}
return 0;
}

区间dp模型之括号匹配打印路径 poj(1141)的更多相关文章

  1. 【栈思想、DP】NYOJ-15 括号匹配(二)

    括号匹配(二) 描述 给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能 ...

  2. 【区间DP】codevs3657 括号序列题解

    题目描述 Description 我们用以下规则定义一个合法的括号序列: (1)空序列是合法的 (2)假如S是一个合法的序列,则 (S) 和[S]都是合法的 (3)假如A 和 B 都是合法的,那么AB ...

  3. LCS(打印路径) POJ 2250 Compromise

    题目传送门 题意:求单词的最长公共子序列,并要求打印路径 分析:LCS 将单词看成一个点,dp[i][j] = dp[i-1][j-1] + 1 (s1[i] == s2[j]), dp[i][j] ...

  4. (区间dp 或 记忆化搜素 )Brackets -- POJ -- 2955

    http://poj.org/problem?id=2955 Description We give the following inductive definition of a “regular ...

  5. 区间dp专题

    HDU4283You Are the One区间dp, 记忆话搜索运行时间:   #include <iostream> #include <cstdio> #include ...

  6. 2016 年沈阳网络赛---QSC and Master(区间DP)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5900 Problem Description Every school has some legend ...

  7. HDU4632 Poj2955 括号匹配 整数划分 P1880 [NOI1995]石子合并 区间DP总结

    题意:给定一个字符串 输出回文子序列的个数    一个字符也算一个回文 很明显的区间dp  就是要往区间小的压缩! #include<bits/stdc++.h> using namesp ...

  8. 括号序列问题 uva 1626 poj 1141【区间dp】

    首先考虑下面的问题:Code[VS] 3657 我们用以下规则定义一个合法的括号序列: (1)空序列是合法的 (2)假如S是一个合法的序列,则 (S) 和[S]都是合法的 (3)假如A 和 B 都是合 ...

  9. POJ 1141 经典DP 轨迹打印

    又几天没写博客了,大二的生活实在好忙碌啊,开了五门专业课,每周都是实验啊实验啊实验啊....我说要本月刷够60题,但好像完不成了,也就每天1题的样子.如今写动规还是挺有条理的,包括这道需要打印轨迹,其 ...

随机推荐

  1. 【Linux命令】杀死僵尸程序

    A zombie is already dead, so you cannot kill it. To clean up a zombie, it must be waited on by its p ...

  2. YIi配置debug工具、yii配置gii工具

    $config['bootstrap'][] = 'debug';$config['modules']['debug'] = [ 'class'=>'yii\debug\Module', 'al ...

  3. Qt plugin系统的几点说明

    对于一个大型软件系统来说,实现plugin是一件很美妙的事情,一个成功的plugin系统可以使软件增色不少.Plugin最大的功能是在一定程度内提高了软件的灵活度和可扩展性.一个设计精良的server ...

  4. Qt中将QTableView中的数据导出为Excel文件

    如果你在做一个报表类的程序,可能将内容导出为Excel文件是一项必须的功能.之前使用MFC的时候我就写过一个类,用于将grid中的数据导出为Excel文件.在使用了QtSql模块后,我很容易的将这个类 ...

  5. WPF:使用Json.NET在TreeView中树形显示JSON数据

    原文 WPF:使用Json.NET在TreeView中树形显示JSON数据 据 读者可以参考这个开源的可以树形显示XML和JSON的工具: Mgen Object 603:XML/JSON树形显示小工 ...

  6. centos下网络代理服务器的配置

    一.临时生效,只在当前用户当前打开的shell终端下生效 在当前控制台下执行如下命令 export http_proxy=http://username:password@proxy_ip:port/ ...

  7. Python: 在Unicode和普通字符串之间转换

    Unicode字符串可以用多种方式编码为普通字符串, 依照你所选择的编码(encoding): <!-- Inject Script Filtered --> Toggle line nu ...

  8. 基于visual Studio2013解决C语言竞赛题之0204实数求值

     题目

  9. MYSQLI - mysqli

    PHP MysqlI操作数据库 1连接数据库. //procedural style$mysqli =  mysqli_connect('host','username','password','da ...

  10. 第一篇:NSTread线程的创建

    #import "ViewController.h" //导入头文件 #import <pthread.h> @interfaceViewController () @ ...