poj 1141(区间dp+打印路径)
题意:
定义合法的括号序列如下:
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+打印路径)相关推荐
- poj 2955 区间dp
题意:给你一串()[]括号,要你求出这串括号的最大匹配个数.如'('与')'匹配,为2个,'['与']'匹配,为2个 思路:区间dp 状态方程: if(s[i]=='('&&s[j]= ...
- POJ 2955 (区间DP)
题目链接: http://poj.org/problem?id=2955 题目大意:括号匹配.对称的括号匹配数量+2.问最大匹配数. 解题思路: 看起来像个区间问题. DP边界:无.区间间隔为0时,默 ...
- F - 你这是第一次让我看到落泪了呢 POJ - 3661Running 区间DP
F - 你这是第一次让我看到落泪了呢 POJ - 3661 The cows are trying to become better athletes, so Bessie is running on ...
- poj 1651区间dp
poj 1651 题意:给出一个序列,要求取走序列中出首尾之外的数字,问最小花费.取走第k个的花费a[k-1]*a[k]*a[k+1]. //#include<bits/stdc++.h> ...
- poj 3280 区间dp
poj 3280 题意:输入一个含n个字母的长度为m的字符串,接下来输入n个字母,每个字母后面两个整数,分别表示删掉这个字母的代价,和添加这个字母的代价,求把该字符串变成回文串的最小代价. //#in ...
- POJ 2955 区间DP必看的括号匹配问题,经典例题
Brackets Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14226 Accepted: 7476 Description ...
- POJ 2955 Brackets (区间DP)
题目链接:http://poj.org/problem?id=2955 Brackets Time Limit: 1000MS Memory Limit: 65536K Total Submiss ...
- POJ 3186Treats for the Cows(区间DP)
题目链接:http://poj.org/problem?id=3186 题目大意:给出的一系列的数字,可以看成一个双向队列,每次只能从队首或者队尾出队,第n个出队就拿这个数乘以n,最后将和加起来,求最 ...
- POJ 1651 Multiplication Puzzle(类似矩阵连乘 区间dp)
传送门:http://poj.org/problem?id=1651 Multiplication Puzzle Time Limit: 1000MS Memory Limit: 65536K T ...
最新文章
- 前端网络知识目录(持续更新)
- Spring Cloud Alibaba - 20 Nacos StandAlone模式下的数据存储(Derby)及新增登录用户
- matlab操作入门实验报告,matlab操作实验报告
- centos7 mysql安装与用户设置
- RGB转YUV420
- java编程如何 实现8开立方等于2_Java之Math类使用小结
- 第 25 章 策略模式
- C语言学生成绩管理系统
- 拯救者Y7000在CentOS7上面无法打开网卡 Ath10k (QCA9377)
- 谁说中国没有林纳斯,中国初代IT宗师的封神榜
- Spring学习笔记(五)--Spring概述
- HC-05蓝牙模块配对方法及AT指令配置
- 【第4章】网络安全体系与网络安全模型(信息安全工程师)
- includes的使用
- 从长尾市场切入 鲲云科技能做出一颗AI芯吗
- 收集的十个高清无版权图片网站
- matlab显示complex double图像问题
- 尾巴大叔回归“大叔”
- [架构之路-202]- 常见的需求获取技术=》输出=》用户需求、客户需求(As...., I want.....)、用例图
- 再读《细节决定成败》有感
热门文章
- 案例 | 易快报:解放“客户成功”的背后故事
- 视频 + PPT | 突破“十面埋伏”,银行业玩转数字化运营
- 数据采集埋点福音!《企业埋点体系搭建方法论及实践经验》白皮书上线
- VMware Skyline
- 大数据+社会化协同 菜鸟不菜成老师
- C++ new/delete、malloc/free
- rsync的原理——转载
- 简单的http服务器示例
- lecture notes for investment bank internship
- 室内使用酒精消毒的时候一定要注意开窗!!!