题目链接: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. 写一个兼容性比较好的拖拽DEMO

    写一个兼容性比较好的拖拽DEMO 查看Demo 思路 div盒子 鼠标按下事件onmousedown 鼠标移动事件onmousemove,获得鼠标的坐标,将div移动至鼠标的当前坐标 鼠标抬起事件om ...

  2. Yii框架中的CURD操作

    <?php $Admin = new Admin(); //查找多条记录,返回二维数组 $Admin->findAll(); $Admin->findAll("id = 2 ...

  3. NSString 用法大全。

    一.NSString 创建字符串.  NSString *astring = @"This is a String!"; 创建空字符串,给予赋值.  NSString *astri ...

  4. Uva 10935 Throwing cards away I

    题目意思:有N张牌,标号为1~N,且牌以叠好,从上到小就是标号1-N的牌,只要牌堆数量大于等于2的时候,就采取如下操作:将最上面的牌扔掉(即离开牌堆).刚才那张牌离开后,再将新的最上面的牌放置于牌堆最 ...

  5. nginx日志每日定时写入Hdfs

    #!/bin/bash hadoop_home=/opt/hadoop-2.4.0 tw_nginx_log_file=/home/chiline.com.all/access_com_tw.log ...

  6. Matrix Factorization, Algorithms, Applications, and Avaliable packages

    矩阵分解 来源:http://www.cvchina.info/2011/09/05/matrix-factorization-jungle/ 美帝的有心人士收集了市面上的矩阵分解的差点儿全部算法和应 ...

  7. c 中有关打印*,字符的题目集

    #include<stdio.h> //1.打印* void priStar() { printf("输入一个整数\n"); int num; scanf(" ...

  8. 在Update Panel 控件里面添加 File Upload 控件 上传文件

    Detail Information:http://www.codeproject.com/Articles/482800/FileplusUploadplusinplusUpdateplusPane ...

  9. iOS 请求数据 error

    解决办法如下: 0x1 ->请求数据时加上缺少的类型 AFHTTPSessionManager *manager = [selfAFHTTPSessionManager];//    manag ...

  10. BZOJ 2599: [IOI2011]Race( 点分治 )

    数据范围是N:20w, K100w. 点分治, 我们只需考虑经过当前树根的方案. K最大只有100w, 直接开个数组CNT[x]表示与当前树根距离为x的最少边数, 然后就可以对根的子树依次dfs并更新 ...