NYOJ15括号匹配

括号匹配(二)

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

描述
给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来。
如:
[]是匹配的
([])[]是匹配的
((]是不匹配的
([)]是不匹配的
输入
第一行输入一个正整数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括号匹配相关推荐

  1. [ACM_NYOJ_15]括号匹配(二)

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

  2. [JS][编程题]括号匹配

    括号匹配 题目来源:牛客网 题目链接:括号匹配 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M 题目描述 给定一个只包含括号的字符串,判断字符串是否有效.其 ...

  3. c语言括号匹配的检验,检验括号匹配的算法

    用栈实现检验括号匹配的算法没啥具体描述,数据结构的知识,急用,有重赏 思想是 先进栈,获取第一个半边括号,标记一下,继续进栈直到获取到第二个与之匹配的另一外括号,然后出栈,取出内容.就这样.. 数据结 ...

  4. 栈 -- 顺序栈、链式栈的实现 及其应用(函数栈,表达式求值,括号匹配)

    文章目录 实现 顺序栈实现 链式栈实现 应用 函数栈 的应用 表达式求值中 的应用 括号匹配中 的应用 我们使用浏览器的时候经常会用到前进.后退功能. 依次访问完一串页面 a – b – c之后点击后 ...

  5. P1944 最长括号匹配(栈模拟/DP)

    P1944 最长括号匹配 可以直接用栈模拟,把匹配好的标记一下, 最后找到最长的匹配输出即可. 如果是要求最长的长度的题那么只需要求数就行了,没必要把原序列真的按照题意改变 如果要求序列,那么只需要按 ...

  6. 2.2栈的另一个应用:括号匹配

    2.2栈的另一个应用:括号匹配 1.LeetCode官网 美网:https://leetcode.com/ 中文网 :https://leetcode-cn.com/ 英语不咋地,所以选择此处选择中文 ...

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

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

  8. java 括号匹配_java---括号匹配

    import java.util.HashMap; import java.util.LinkedList; import java.util.Map; /* *括号匹配 * 1.用栈实现,如果读取字 ...

  9. (转载)vim括号匹配等跳转技巧

    转载于:https://blog.csdn.net/u013408061/article/details/77523318 vim 括号匹配跳转操作: % 跳转到相配对的括号 gD 跳转到局部变量的定 ...

  10. CCF NOI1113 括号匹配

    问题链接:CCF NOI1113 括号匹配. 时间限制: 1000 ms  空间限制: 262144 KB 题目描述 给定一个只包含左右括号的合法括号序列,按右括号从左到右的顺序输出每一对配对的括号出 ...

最新文章

  1. js获取当前页面的参数,带完善~~~
  2. oracle让查出来的数据排序,Oracle数据库的查询排序
  3. Bootstrap系列 -- 41. 带表单的导航条
  4. leetcode607. 销售员(SQL)
  5. qvector 结构体排序_1164 2547 (排序微课)(B站视频链接)
  6. 斯图加特大学GPU光线投射体渲染技术提携
  7. 图卷积神经网络入门详解
  8. 华为支持nfc功能的手机有哪些_四款带NFC功能的千元机,三星华为低至1399元!...
  9. 网页常用分享代码大全——整理摘抄至他人嘿嘿
  10. 有多少小微餐饮创业者陷入了“就业型创业”的死亡漩涡而不自知?
  11. Yii2数据库操作的各种写法
  12. 除了数据恢复,EasyRecovery还有这样的功能!
  13. Typora加超链接实现页内跳转的三种方法
  14. 智能家居-斐讯N1安装篇
  15. Spring之IOC自动装配解析
  16. MySQL高级篇——事务
  17. 苹果safari浏览器的正确使用方法
  18. 洛谷P2851 [USACO06DEC]The Fewest Coins G 题解
  19. Android中的AOP编程之AspectJ实战实现数据埋点
  20. 局部边缘保留滤波器LEP算法原理及matlab代码实现

热门文章

  1. getchar() 和 scanf(%c)的区别
  2. 用于编译cm-12.0 的 local_manifest.xml文件
  3. PHP 图片处理类 错误处理方法:
  4. 详解回调函数(同步回调,异步回调)
  5. kuangbin带你飞dp专题-基础dp
  6. Linux下七牛云存储qrsync命令行上传同步工具
  7. php utf8 正则中文表达式
  8. centos 查看版本(转)
  9. 基于visual Studio2013解决面试题之0504单链表逆序
  10. excel字符处理函数