括号匹配(二)

时间限制:1000 ms | 内存限制:65535 KB
难度:6

描述
给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来。
如:
[]是匹配的
([])[]是匹配的
((]是不匹配的
([)]是不匹配的

输入
第一行输入一个正整数N,表示测试数据组数(N<=10)
每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度不超过100

输出
对于每组测试数据都输出一个正整数,表示最少需要添加的括号的数量。每组测试输出占一行

样例输入
4
[]
([])[]
((]
([)]

样例输出
0
0
3
2

来源
NYOJ15

当时看到“二”字就顺带把括号匹配(一)给做了,一很容易,但说实话这道题我纠结了两天,直到今晚才做出来,惭愧 [流泪] 。。。

这道题的类别是分在动态规划里的,不愧是难度6的题,虽然从一个开始就知道是用动态规划来做,但还是很难想到思路。。我的思路是这样的:

dp[i][j](j >= i)表示使从第i个字符到第j个字符匹配所需添加的最小括号数(有点绕口,但应该不难明白吧),那么这一状态可由下面得到:

  1. 若第i个字符到第j - 1个字符中没有与第j个字符匹配的括号,则所需的括号数加1,即f[i][j] = f[i][j - 1] + 1;
  2. 若第k(k < i)个字符与第j个字符匹配,那么所需括号数为第i到第k - 1个字符所需字符数加上第k + 1个字符到第i - 1个字符(注意可能存在多个字符与之匹配,即可能存在多个k),所需括号数f[i][j] = min(f[i][j], f[j][k - 1] + f[k + 1][i - 1])。

代码如下:

#include<iostream> #include<string> #include<memory.h> using namespace std; bool is(char a, char b){ if(a == '(' && b == ')') return 1; if(a == '[' && b == ']') return 1; return 0; } int main(){ //dp[i][j] 表示从第i位至第j位的最小匹配长度 int t, i, j, k, dp[105][105]; cin >> t; while(t--){ string s; cin >> s; memset(dp, 0, sizeof(dp)); for(i = 0; i <= s.length(); ++i){ dp[i][i] = 1; } for(i = 2; i <= s.length(); ++i){ for(j = i - 1; j >= 1; --j){ dp[j][i] = dp[j][i - 1] + 1; for(k = j; k < i; ++k){ if(is(s[k - 1], s[i - 1])){ dp[j][i] = min(dp[j][i], dp[j][k - 1] + dp[k + 1][i - 1]); } } } } cout << dp[1][s.length()] << endl; } return 0; }


=======================签 名 档=======================
原文地址(我的博客):http://lanfei.sinaapp.com/2012/04/745.html
欢迎访问交流,至于我为什么要多弄一个博客,因为我热爱前端,热爱网页,我更希望有一个更加自由、真正属于我自己的小站,或许并不是那么有名气,但至少能够让我为了它而加倍努力。。
=======================签 名 档=======================

转载于:https://www.cnblogs.com/springside6/archive/2012/04/18/2525065.html

[ACM_NYOJ_15]括号匹配(二)相关推荐

  1. 457. 括号匹配二

    [题目描述]: 给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些 ...

  2. [NYOJ 15] 括号匹配(二)

    括号匹配(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:6 描述给你一个字符串,里面只包含"(",")","[" ...

  3. 数据结构(二)——栈及实现、括号匹配

    一.栈的概念与特点 一种特殊的线性表,它的插入和删除运算均在同一端进行.这一端被称为栈顶,另一端为栈底,插入称为进栈,删除称为出栈.有后进先出的性质.栈顶top相当于顺序表中的size,即元素个数.关 ...

  4. python 栈_Python数据结构与算法05:基本结构:栈的应用之括号匹配

    注:本文如涉及到代码,均经过Python 3.7实际运行检验,保证其严谨性. 本文阅读时间约为7分钟. 算法流程 括号匹配情况介绍 我们经常会遇到类似(9-1)*(8+7)/(4-2).print(& ...

  5. 快速解决工作中遇到经典的括号匹配问题

    问题来源:从缓存中取出的数据没有空格和换行,很难阅读,但又找不到像JSON一样的在线格式化工具.灵机一动,自己写了一个小程序将其格式化. 一.先看效果 1.原始数据长这样,难以阅读 MemCached ...

  6. 数据结构之栈的应用:括号匹配问题

    栈的应用 括号匹配问题: 原理: 代码实现: 括号匹配问题: 原理: 1.括号匹配成功的情况:栈为空 2.括号匹配失败的情况: a.下一个为右括号但是和栈顶左括号不匹配 b.下一个是右括号但栈以空 c ...

  7. (王道408考研数据结构)第三章栈和队列-第三节1:栈的应用之括号匹配问题和表达式问题(前缀、中缀和后缀)

    前面我们就说过,栈是一种先进后出的线性表,这种先进后出的特性就决定了它在一类场合或问题中会经常被用到--递归.考研数据结构中所涉及的利用栈结构解决递归问题或者考察栈结构特性的问题主要有这么几类 括号匹 ...

  8. 数据结构括号匹配代码_数据结构中的栈,你知道多少?

    由于栈比较简单,也很容易理解,学过的人都知道一句话就可以描述栈的特性:后进先出.所以这篇文章主要是写如何使用代码来描述栈,当然也是让大家很容易理解的语言.还是先给出这篇文章的大致脉络. 首先,对栈有一 ...

  9. 题目1072 括号匹配问题

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 题目描述 ...

最新文章

  1. 2021年大数据基础(一):大数据概念
  2. 图解Spark原理及实践----大数据技术栈12
  3. python expect模块_PYTHON基础语法全面总结
  4. Android开发中反编译时出现Unsupported major.minor version 51.0错误的问题
  5. 大数据分析币圈动态: ETH、BTC、BCH每秒交易均呈负增长! 以太坊网络传播时间再缩短
  6. LeetCode 2001. 可互换矩形的组数
  7. Yarn简单介绍及内存配置
  8. 电脑提示找不到宽带连接怎么办
  9. Python学习之路day3-集合
  10. 主成份分析(PCA)——原理、实现步骤
  11. OI树上问题 简单学习笔记
  12. (亲测有效).net framework 在计算机上已安装了更高的 4.x 版本,则无法安装以前的 4.5 版本。
  13. 怎么将几张pdf合并成一张_怎么把多个PDF合并成一个PDF?分享合并PDF文件最简单的方法...
  14. maxscript文件常规命令
  15. 安装Ubuntu16.04视频播放器smplayer
  16. MTK6735 竖屏横用、旋转90度、MTK_LCM_PHYSICAL_ROTATION
  17. 计算机经验交流活动简报,经验交流会简讯.doc
  18. 如何使用 Lightly 分享项目?
  19. 脑电图(EEG)与脑电导分布10-20系统
  20. 【科普】基础教程系列之装系统篇

热门文章

  1. java jsch 调用shell_Java-Jsch-Shell脚本执行后退出
  2. ionic 去掉启动页的加载动画 菊花转
  3. gitlab项目中启用或禁用 GitLab CI/CD Pipeline
  4. 简单的动态网站java,Java实践:一个简单的动态数组实现
  5. dll文件 修改特征码_Could not load dynamic library cublas64_10.dll
  6. linux root 设置中文,ubuntu 8.04 root用户下的中文环境配置-Linux频道-中国IT实验室
  7. docker公共存储库_Docker Hub镜像公共仓库使用
  8. Java获得中文输入_使用java简单实现根据输入的汉字,得到汉字的首字母
  9. python 提取最小外接矩形_python给人脸带上口罩(简单版)
  10. java 手动加载数据库驱动_JAVA加载数据库驱动(JDBC)