括号匹配(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 ...
随机推荐
- mongoDB对没有字段的记录新增字段
db.getCollection('ClassRecordOneDetail').updateMany({'synState':{'$exists':false}},{'$set':{'synStat ...
- test aria2 on windows platform
import 'dart:io'; import 'dart:convert'; import 'package:path/path.dart'; import 'package:web_socket ...
- How do you run an interactive process in Dart?
https://stackoverflow.com/questions/12682269/how-do-you-run-an-interactive-process-in-dart The test ...
- Matlab责任链模式
责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦,本人根据https://www.ru ...
- linux下svn解决冲突
1. 使用svn status + 文件路径+文件名 查看文件或目录的状态(该状态可自行进行百度),属性状态为'C'的表示,改文件或目录处于冲突状态 2. 使用svn resolve --accept ...
- Web开发基础知识
综述 最近开始Java Web方面的工作,千里之行始于足下,我们在开发过程中要善于总结自己遇到的问题.善于管理一些优秀的代码片段.本文的主要内容是Web开发的基础知识,对于大牛来说可以忽略,对于初入W ...
- LeetCode刷题:Reverse Words in a String(翻转字符串中的单词)
题目 Given an input string, reverse the string word by word. For example, Given s = "the sky is b ...
- unnitest+HtmlRunner生成测试报告
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019/5/5 21:23 # @Author : ChenAdong # @emai ...
- springboot-实现log4j的AOP切面
参考链接: https://www.cnblogs.com/liaojie970/p/7883687.html https://blog.csdn.net/autfish/article/detail ...
- 【DATAGUARD】物理dg配置客户端无缝切换 (八.3)--客户端TAF 配置
[DATAGUARD]物理dg配置客户端无缝切换 (八.3)--客户端TAF 配置 一.1 BLOG文档结构图 一.2 前言部分 一.2.1 导读 各位技术爱好者,看完本文后,你 ...