NYOJ15括号匹配
NYOJ15括号匹配
括号匹配(二)
- 描述
-
给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来。
如:
[]是匹配的
([])[]是匹配的
((]是不匹配的
([)]是不匹配的
- 输入
-
第一行输入一个正整数N,表示测试数据组数(N<=10)
每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度不超过100 - 输出
- 对于每组测试数据都输出一个正整数,表示最少需要添加的括号的数量。每组测试输出占一行
- 样例输入
-
4 [] ([])[] ((] ([)]
- 样例输出
-
0 0 3 2
- 来源《算法艺术与信息学竞赛》
分析
二维数组dp[i][j] 表示字符串s的第i..j字符需要最少括号数,下面是具体的表示:
当i= j的时候,只有一个字符,那么,只要匹配一个字符就行了,所以,dp[i][i] = 1
如果,当i < j的时候,s[i] = s[j] 那么,dp[i][j] = min(dp[i][j],dp[i+1][j+1]),其中,假设i <= k < j 状态转移方程为 dp[i][j] = min(dp[i][j],d[i][k] + dp[k+1][j])
换个角度,换个方向
分析:我们求出这个串的最大匹配,然后串的总长度-最大匹配就是答案。
方法1:首先能想到的是转化成LCS(最长公共子序列),枚举中间点,求所有的LCS中的最大值 * 2就是最大匹配。但是复杂度较高,光LCS一次就O(n^2)的复杂度。
方法2:
首先考虑怎么样定义dp让它满足具有通过子结构来求解、
定义dp [ i ] [ j ] 为串中第 i 个到第 j 个括号的最大匹配数目
那么我们假如知道了 i 到 j 区间的最大匹配,那么i+1到 j+1区间的是不是就可以很简单的得到。
那么 假如第 i 个和第 j 个是一对匹配的括号那么dp [ i ] [ j ] = dp [ i+1 ] [ j-1 ] + 2 ;
那么我们只需要从小到大枚举所有 i 和 j 中间的括号数目,然后满足匹配就用上面式子dp,然后每次更新dp [ i ] [ j ]为最大值即可。
更新最大值的方法是枚举 i 和 j 的中间值,然后让 dp[ i ] [ j ] = max ( dp [ i ] [ j ] , dp [ i ] [ f ] + dp [ f+1 ] [ j ] ) ;
1 #include <stdio.h> 2 #include <string.h> 3 4 #define min(x,y) (x < y ? x : y) 5 #define MAX 101 6 7 int dp[MAX][MAX]; 8 9 bool cmp(int n,int m) 10 { 11 if((n == '('&&m == ')')||(n == '['&&m == ']')) 12 return 1; 13 else 14 return 0; 15 } 16 17 int main(void) 18 { 19 int n,m,i,j,k; 20 char str[101]; 21 scanf("%d",&n); 22 while(n--) 23 { 24 scanf("%s",str); 25 int length = strlen(str); 26 memset(dp,0,sizeof(dp)); 27 for(i = 0; i < length; i++) 28 { 29 dp[i][i] = 1; 30 } 31 //区间dp常用dp套路 32 for(m = 1; m < length; m++)//枚举的串长度 33 { 34 for(i = 0; i < length - m; i++)//起点 35 { 36 j = i + m;//终点 37 dp[i][j] = MAX; //初始值 38 if(cmp(str[i],str[j])) 39 dp[i][j] = min(dp[i][j],dp[i+1][j-1]);//消去匹配的括号 40 //枚举中间点 41 for(k = i; k < j; k++) 42 { 43 dp[i][j] = min(dp[i][j],dp[i][k]+dp[k+1][j]); 44 } 45 } 46 } 47 printf("%d\n",dp[0][length-1]); 48 } 49 return 0; 50 }
NYOJ15括号匹配相关推荐
- [ACM_NYOJ_15]括号匹配(二)
括号匹配(二) 时间限制:1000 ms | 内存限制:65535 KB 难度:6 描述 给你一个字符串,里面只包含"(",")","[", ...
- [JS][编程题]括号匹配
括号匹配 题目来源:牛客网 题目链接:括号匹配 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M 题目描述 给定一个只包含括号的字符串,判断字符串是否有效.其 ...
- c语言括号匹配的检验,检验括号匹配的算法
用栈实现检验括号匹配的算法没啥具体描述,数据结构的知识,急用,有重赏 思想是 先进栈,获取第一个半边括号,标记一下,继续进栈直到获取到第二个与之匹配的另一外括号,然后出栈,取出内容.就这样.. 数据结 ...
- 栈 -- 顺序栈、链式栈的实现 及其应用(函数栈,表达式求值,括号匹配)
文章目录 实现 顺序栈实现 链式栈实现 应用 函数栈 的应用 表达式求值中 的应用 括号匹配中 的应用 我们使用浏览器的时候经常会用到前进.后退功能. 依次访问完一串页面 a – b – c之后点击后 ...
- P1944 最长括号匹配(栈模拟/DP)
P1944 最长括号匹配 可以直接用栈模拟,把匹配好的标记一下, 最后找到最长的匹配输出即可. 如果是要求最长的长度的题那么只需要求数就行了,没必要把原序列真的按照题意改变 如果要求序列,那么只需要按 ...
- 2.2栈的另一个应用:括号匹配
2.2栈的另一个应用:括号匹配 1.LeetCode官网 美网:https://leetcode.com/ 中文网 :https://leetcode-cn.com/ 英语不咋地,所以选择此处选择中文 ...
- python 栈_Python数据结构与算法05:基本结构:栈的应用之括号匹配
注:本文如涉及到代码,均经过Python 3.7实际运行检验,保证其严谨性. 本文阅读时间约为7分钟. 算法流程 括号匹配情况介绍 我们经常会遇到类似(9-1)*(8+7)/(4-2).print(& ...
- java 括号匹配_java---括号匹配
import java.util.HashMap; import java.util.LinkedList; import java.util.Map; /* *括号匹配 * 1.用栈实现,如果读取字 ...
- (转载)vim括号匹配等跳转技巧
转载于:https://blog.csdn.net/u013408061/article/details/77523318 vim 括号匹配跳转操作: % 跳转到相配对的括号 gD 跳转到局部变量的定 ...
- CCF NOI1113 括号匹配
问题链接:CCF NOI1113 括号匹配. 时间限制: 1000 ms 空间限制: 262144 KB 题目描述 给定一个只包含左右括号的合法括号序列,按右括号从左到右的顺序输出每一对配对的括号出 ...
最新文章
- js获取当前页面的参数,带完善~~~
- oracle让查出来的数据排序,Oracle数据库的查询排序
- Bootstrap系列 -- 41. 带表单的导航条
- leetcode607. 销售员(SQL)
- qvector 结构体排序_1164 2547 (排序微课)(B站视频链接)
- 斯图加特大学GPU光线投射体渲染技术提携
- 图卷积神经网络入门详解
- 华为支持nfc功能的手机有哪些_四款带NFC功能的千元机,三星华为低至1399元!...
- 网页常用分享代码大全——整理摘抄至他人嘿嘿
- 有多少小微餐饮创业者陷入了“就业型创业”的死亡漩涡而不自知?
- Yii2数据库操作的各种写法
- 除了数据恢复,EasyRecovery还有这样的功能!
- Typora加超链接实现页内跳转的三种方法
- 智能家居-斐讯N1安装篇
- Spring之IOC自动装配解析
- MySQL高级篇——事务
- 苹果safari浏览器的正确使用方法
- 洛谷P2851 [USACO06DEC]The Fewest Coins G 题解
- Android中的AOP编程之AspectJ实战实现数据埋点
- 局部边缘保留滤波器LEP算法原理及matlab代码实现