题意:

定义合法的括号序列如下:

1 空序列是一个合法的序列

2 如果S是合法的序列,则(S)和[S]也是合法的序列

3 如果A和B是合法的序列,则AB也是合法的序列

例如:下面的都是合法的括号序列

(),  [],  (()),  ([]),  ()[],  ()[()]

下面的都是非法的括号序列

(,  [,  ),  )(,  ([)],  ([(]

给定一个由'(',  ')',  '[', 和 ']' 组成的序列,找出以该序列为子序列的最短合法序列。

解题思路:这题只是普通的区间dp多了一个路径输出的过程,dp[i][j]表示i-j要匹配需要修改的最小值。输出路径的时候只要根据状态转移方程就可以确定了。这里有一个要注意的地方,如果说i和j是(和),dp[i][j]不一定就是dp[i+1][j-1],因为i和j不一定就是最后要匹配的,i,j可能和中间的括号匹配。例如:[][]

详细的见代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#define min(a,b) a < b ? a : b
using namespace std;const int maxn = 105;
const int inf = 0x7fffff;
int n,dp[maxn][maxn],c[maxn][maxn];
char str[maxn];void Path(int l,int r)
{if(l > r) return;else if(l == r){if(str[l] == '(' || str[l] == ')')printf("()");else if(str[l] == '[' || str[l] == ']')printf("[]");return;}if((str[l] == '(' && str[r] == ')' || str[l] == '[' && str[r] == ']') && dp[l][r] == dp[l+1][r-1]){printf("%c",str[l]);Path(l+1,r-1);printf("%c",str[r]);}else{for(int k = l; k < r; k++)if(dp[l][r] == dp[l][k] + dp[k+1][r]){Path(l,k);Path(k+1,r);return;}}
}int main()
{while(gets(str+1)){n = strlen(str+1);memset(dp,0,sizeof(dp));for(int i = 1; i <= n; i++)dp[i][i] = 1;for(int l = 2; l <= n; l++)for(int i = 1; i <= n; i++){int j = i + l - 1;dp[i][j] = inf;if(j > n) break;if(str[i] == '(' && str[j] == ')' || str[i] == '[' && str[j] == ']')dp[i][j] = dp[i+1][j-1];for(int k = i; k < j; k++)dp[i][j] = min(dp[i][j],dp[i][k]+dp[k+1][j]);}Path(1,n);printf("\n");}return 0;
}

poj 1141(区间dp+打印路径)相关推荐

  1. poj 2955 区间dp

    题意:给你一串()[]括号,要你求出这串括号的最大匹配个数.如'('与')'匹配,为2个,'['与']'匹配,为2个 思路:区间dp 状态方程: if(s[i]=='('&&s[j]= ...

  2. POJ 2955 (区间DP)

    题目链接: http://poj.org/problem?id=2955 题目大意:括号匹配.对称的括号匹配数量+2.问最大匹配数. 解题思路: 看起来像个区间问题. DP边界:无.区间间隔为0时,默 ...

  3. F - 你这是第一次让我看到落泪了呢 POJ - 3661Running 区间DP

    F - 你这是第一次让我看到落泪了呢 POJ - 3661 The cows are trying to become better athletes, so Bessie is running on ...

  4. poj 1651区间dp

    poj 1651 题意:给出一个序列,要求取走序列中出首尾之外的数字,问最小花费.取走第k个的花费a[k-1]*a[k]*a[k+1]. //#include<bits/stdc++.h> ...

  5. poj 3280 区间dp

    poj 3280 题意:输入一个含n个字母的长度为m的字符串,接下来输入n个字母,每个字母后面两个整数,分别表示删掉这个字母的代价,和添加这个字母的代价,求把该字符串变成回文串的最小代价. //#in ...

  6. POJ 2955 区间DP必看的括号匹配问题,经典例题

    Brackets Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14226 Accepted: 7476 Description ...

  7. POJ 2955 Brackets (区间DP)

    题目链接:http://poj.org/problem?id=2955 Brackets Time Limit: 1000MS   Memory Limit: 65536K Total Submiss ...

  8. POJ 3186Treats for the Cows(区间DP)

    题目链接:http://poj.org/problem?id=3186 题目大意:给出的一系列的数字,可以看成一个双向队列,每次只能从队首或者队尾出队,第n个出队就拿这个数乘以n,最后将和加起来,求最 ...

  9. POJ 1651 Multiplication Puzzle(类似矩阵连乘 区间dp)

    传送门:http://poj.org/problem?id=1651 Multiplication Puzzle Time Limit: 1000MS   Memory Limit: 65536K T ...

最新文章

  1. 前端网络知识目录(持续更新)
  2. Spring Cloud Alibaba - 20 Nacos StandAlone模式下的数据存储(Derby)及新增登录用户
  3. matlab操作入门实验报告,matlab操作实验报告
  4. centos7 mysql安装与用户设置
  5. RGB转YUV420
  6. java编程如何 实现8开立方等于2_Java之Math类使用小结
  7. 第 25 章 策略模式
  8. C语言学生成绩管理系统
  9. 拯救者Y7000在CentOS7上面无法打开网卡 Ath10k (QCA9377)
  10. 谁说中国没有林纳斯,中国初代IT宗师的封神榜
  11. Spring学习笔记(五)--Spring概述
  12. HC-05蓝牙模块配对方法及AT指令配置
  13. 【第4章】网络安全体系与网络安全模型(信息安全工程师)
  14. includes的使用
  15. 从长尾市场切入 鲲云科技能做出一颗AI芯吗
  16. 收集的十个高清无版权图片网站
  17. matlab显示complex double图像问题
  18. 尾巴大叔回归“大叔”
  19. [架构之路-202]- 常见的需求获取技术=》输出=》用户需求、客户需求(As...., I want.....)、用例图
  20. 再读《细节决定成败》有感

热门文章

  1. 案例 | 易快报:解放“客户成功”的背后故事
  2. 视频 + PPT | 突破“十面埋伏”,银行业玩转数字化运营
  3. 数据采集埋点福音!《企业埋点体系搭建方法论及实践经验》白皮书上线
  4. VMware Skyline
  5. 大数据+社会化协同 菜鸟不菜成老师
  6. C++ new/delete、malloc/free
  7. rsync的原理——转载
  8. 简单的http服务器示例
  9. lecture notes for investment bank internship
  10. 室内使用酒精消毒的时候一定要注意开窗!!!