括号匹配(POJ2955)题解
原题地址:http://poj.org/problem?id=2955
题目大意:给出一串括号,求其中的最大匹配数。
我这么一说题目大意估计很多人就蒙了,其实我看到最开始的时候也是很蒙的。这里就来解释一下题意。
这道题让求的是最大常规匹配数,什么是常规匹配呢?
() [] ()[] []() [()]都是常规序列。
翻译一下题目的英文:
我们给出了“常规括号”序列的以下归纳定义:
- 空序列是常规括号序列,
- 如果s是常规括号序列,则(s)和[ s ]是常规括号序列,并且
- 如果a和b是常规括号序列,则ab是常规括号序列。
- 没有其他序列是常规括号序列
样例输入
((()))
()()()
([]])
)[)(
([][][)
end
样例输出
6
6
4
0
6
现在开始说思路。
很明显,这是一道区间DP,因为大的常规括号一定是包含小的常规括号的,满足我们区间DP的要求。
区间DP常用枚举方式见
https://www.cnblogs.com/lizitong/p/10014809.html
首先是状态,非常简单,dp[i][j]表示从i到j的最大匹配数,我们要求的答案就是dp[1][n]
我们开始枚举,假如我们枚举到的[i][j]中,第i个和第j个是匹配的括号,即()或者[ ]
那么dp[i][j]=dp[i+1][j-1]+2;
没错吧,我们只需要在原基础上+2就好了。
如果[i] 和[j]不匹配呢?
那我们可以把这个区间分为两段,以k为分界点。
分成[i][k],[k+1][j]两段,然后把两段的值相加就好了。因为这两个括号不匹配,不代表其中的不匹配。人不能在一棵树上吊死。
需要注意的是,即使是[i]和[j]两个括号匹配,仍需枚举k来判断是否可以将这个区间分成两段,因为这样得到的仍然可能不是最优解。
例如:()()这个序列。
显然答案应该为4,但是最左面和最右面匹配,而中间 ")(" 区间的答案为0,导致最后的结果为2。
枚举k的时候需要注意枚举范围。
上代码。
提示:个人区间是从0存到的n-1。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
char a[];
int dp[][];
int main()
{
while(scanf("%s",a)!=EOF)
{
if(a[]=='e')
{
return ;
}
int n = strlen(a);
memset(dp,,sizeof(dp));
for(int len = ;len<=n;len++)
{
for(int i = ;i+len-<=n-;i++)
{
int j = i+len-;
if((a[i]=='('&&a[j]==')')||(a[i]=='['&&a[j]==']'))
{
dp[i][j] = max(dp[i][j],dp[i+][j-]+);
} for(int k = i;k<=j;k++)
{
dp[i][j] = max(dp[i][j],dp[i][k]+dp[k+][j]);
}
}
}
printf("%d\n",dp[][n-]);
}
return ;
}
括号匹配(POJ2955)题解的更多相关文章
- HDU4632 Poj2955 括号匹配 整数划分 P1880 [NOI1995]石子合并 区间DP总结
题意:给定一个字符串 输出回文子序列的个数 一个字符也算一个回文 很明显的区间dp 就是要往区间小的压缩! #include<bits/stdc++.h> using namesp ...
- POJ-2955 Brackets(括号匹配问题)
题目链接:http://poj.org/problem?id=2955 这题要求求出一段括号序列的最大括号匹配数量 规则如下: the empty sequence is a regular brac ...
- 《LeetBook》leetcode题解(20):Valid Parentheses[E]——栈解决括号匹配问题
我现在在做一个叫<leetbook>的免费开源书项目,力求提供最易懂的中文思路,目前把解题思路都同步更新到gitbook上了,需要的同学可以去看看 书的地址:https://hk029.g ...
- NYOJ15|括号匹配(二)|区间DP|Elena
括号匹配(二) 时间限制:1000 ms | 内存限制:65535 KB 难度:6 描述 给你一个字符串,里面只包含"(",")","[&qu ...
- HDU 4283 You Are the One ★(进出栈的括号匹配性质:区间DP)
题意 有一个队列,每个人有一个愤怒值D,如果他是第K个上场,不开心指数就为(K-1)*D.但是边上有一个小黑屋(一个FILO堆栈),可以一定程度上调整上场程序,求一种安排上场方案使得所有人的不开心指数 ...
- [ZPG TEST 114] 括号匹配【树分治 点分治 括号序列】
1. 括号匹配 有一棵树,每个节点上都有一个括号(左括号或者右括号).有多少个有序点对(u, v)从u到v的路径上的节点构成的字符串是一个合法的括号匹配?(我们称这样的点对是合法的) 输 ...
- P1944 最长括号匹配_NOI导刊2009提高(1)
P1944 最长括号匹配_NOI导刊2009提高 题解 宁愿相信世上有鬼,也不能随便相信某谷题目标签 我想了半天然后看了眼题解,发现用栈来模拟就好了 栈来模拟,还要用到一个bool数组,标记是否已经匹 ...
- 括号匹配 区间DP (经典)
描述给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来 ...
- YTU 3003: 括号匹配(栈和队列)
3003: 括号匹配(栈和队列) 时间限制: 1 Sec 内存限制: 128 MB 提交: 2 解决: 2 [提交][状态][讨论版] 题目描述 假设一个表达式中只允许包含三种括号:圆括号&quo ...
随机推荐
- C# DataTable、DataSet、List、相互转换
DataTable转LIst /// <summary> /// 利用反射将DataTable转换为List<T>对象 /// </summary> /// & ...
- AspNetCore MVC页面数据提交验证
2019/05/14,AspNetCore 2.2.0 摘要:AspNetCore MVC使用数据注释配合jquery.validate提交页面进行前端加后端的数据验证 主要用到了jquery.val ...
- 1 matplotlib绘制折线图
from matplotlib import pyplot as plt #设置图形大小 plt.figure(figsize=(20,8),dpi=80) plt.plot(x,y,color=&q ...
- 遍历切片slice,结构体struct,映射map,interface{}的属性和值
1 前言 说明:interface{}必须是前三者类型 2 代码 /** * @Author: FB * @Description: * @File: testOutput.go * @Version ...
- iptables限制访问
iptables限制访问 常用命令 # 查看规则 iptables -L INPUT --line-numbers # 开放指定的端口 iptables -A INPUT -p tcp --dport ...
- java反射 详解!!!!
java反射(特别通俗易懂) 反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)) 一.反射的概述 JAVA反射机制是在运行状态 ...
- 【转载】C#中List集合使用GetRange方法获取指定索引范围内的所有值
在C#的List集合中有时候需要获取指定索引位置范围的元素对象来组成一个新的List集合,此时就可使用到List集合的扩展方法GetRange方法,GetRange方法专门用于获取List集合指定范围 ...
- Flask 和 Django 框架的区别
1)Flask Flask确实很“轻”,不愧是Micro Framework,从Django转向Flask的开发者一定会如此感慨,除非二者均为深入使用过 Flask自由.灵活,可扩展性强,第三方库的选 ...
- jQuery知识梳理20190817
目录 jQuery知识梳理20190817 1. jQuery的特征 2. jQuery的两把利器 2.1 jQuery核心函数 2.2 jQuery核心对象 3. jQuery核心函数详解 4. j ...
- RocketMQ-c#代码
导入包: https://github.com/gaufung/rocketmq-client-dotnet/tree/master using org.apache.rocketmq.client. ...