括号匹配(二)

时间限制:1000 ms | 内存限制:65535 KB
难度:6
描写叙述
给你一个字符串,里面仅仅包括"(",")","[","]"四种符号,请问你须要至少加入多少个括号才干使这些括号匹配起来。

如:

[]是匹配的

([])[]是匹配的

((]是不匹配的

([)]是不匹配的

输入
第一行输入一个正整数N,表示測试数据组数(N<=10)

每组測试数据都仅仅有一行,是一个字符串S,S中仅仅包括以上所说的四种字符,S的长度不超过100
输出
对于每组測试数据都输出一个正整数,表示最少须要加入的括号的数量。每组測试输出占一行
例子输入
  1. 4
  2. []
  3. ([])[]
  4. ((]
  5. ([)]
例子输出
  1. 0
  2. 0
  3. 3
  4. 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. #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. for(m = 1; m < length; m++)
  32. {
  33. for(i = 0; i < length - m; i++)
  34. {
  35. j = i + m;
  36. dp[i][j] = MAX;
  37. if(cmp(str[i],str[j]))
  38. dp[i][j] = min(dp[i][j],dp[i+1][j-1]);
  39. for(k = i; k < j; k++)
  40. {
  41. dp[i][j] = min(dp[i][j],dp[i][k]+dp[k+1][j]);
  42. }
  43. }
  44. }
  45. printf("%d\n",dp[0][length-1]);
  46. }
  47. return 0;
  48. }

NYOJ - 括号匹配(二)(经典dp)的更多相关文章

  1. [原]NYOJ 括号匹配系列2,5

    本文出自:http://blog.csdn.net/svitter 括号匹配一:http://acm.nyist.net/JudgeOnline/problem.php?pid=2 括号匹配二:htt ...

  2. POJ 2955 括号匹配,区间DP

    题意:给你一些括号,问匹配规则成立的括号的个数. 思路:这题lrj的黑书上有,不过他求的是添加最少的括号数,是的这些括号的匹配全部成立. 我想了下,其实这两个问题是一样的,我们可以先求出括号要匹配的最 ...

  3. POJ 1141 Brackets Sequence(括号匹配二)

    题目链接:http://poj.org/problem?id=1141 题目大意:给你一串字符串,让你补全括号,要求补得括号最少,并输出补全后的结果. 解题思路: 开始想的是利用相邻子区间,即dp[i ...

  4. 九度OJ 1153:括号匹配问题 (DP)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5193 解决:2248 题目描述: 在某个字符串(长度不超过100)中有左括号.右括号和大小写字母:规定(与常见的算数式子一样)任何一个左括 ...

  5. POJ 2955 Brackets --最大括号匹配,区间DP经典题

    题意:给一段左右小.中括号串,求出这一串中最多有多少匹配的括号. 解法:此问题具有最优子结构,dp[i][j]表示i~j中最多匹配的括号,显然如果i,j是匹配的,那么dp[i][j] = dp[i+1 ...

  6. NYOJ15-括号匹配(二)-区间DP

    pid=15">http://acm.nyist.net/JudgeOnline/problem.php? pid=15 dp[i][j]表示从i到j至少须要加入多少个括号才干满足匹配 ...

  7. nyoj 括号匹配

    这个方程有两种形式,本文采用 if(s[i]=s[j]) dp[i][j]=d[i-1][j-1]   dp[i][j]=min(dp[i][k]+dp[k+1][j],dp[i][j]) (i=&l ...

  8. poj2955:括号匹配,区间dp

    题目大意: 给一个由,(,),[,]组成的字符串,其中(),[]可以匹配,求最大匹配数 题解:区间dp: dp[i][j]表示区间 [i,j]中的最大匹配数 初始状态 dp[i][i+1]=(i,i+ ...

  9. POJ - 2955 Brackets括号匹配(区间dp)

    Brackets We give the following inductive definition of a “regular brackets” sequence: the empty sequ ...

随机推荐

  1. [Ramda] Getter and Setter in Ramda & lens

    Getter on Object: 1. prop: R.prop(}); //=> 100 R.prop('x', {}); //=> undefined 2. props: R.pro ...

  2. 【LeetCode】【C++】Linked list cycle 2

    Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Foll ...

  3. 可直接复制粘贴的boostrap图标库网址

    1:http://fontawesome.dashgame.com/ 2:http://www.kuiyu.net/art-34.html 3:http://www.bootcss.com/p/fon ...

  4. 关于.c和.h 和定义变量的问题

    最初调试的时候是因为有个错误在wavplay.h文件中 于是我跳到了recorderl.h中:从图中看到引用了main.h 出现这个问题的具体原因还是不太清楚: 不过我任务是因为: wavplay.h ...

  5. https://www.cyberciti.biz/faq/howto-change-rename-user-name-id/

    https://www.cyberciti.biz/faq/howto-change-rename-user-name-id/

  6. HTML5开发移动web应用——SAP UI5篇(9)

    之前我们对于app的构建都是基于显示的.如今我们来格式化一下,引入很多其它的SAP UI5组件概念.这使得APP的一个界面更有层次性.更像是一个手机应用的界面,而且更好地使用SAP UI5中提供的功能 ...

  7. 调用另一个Activity 分类: H1_ANDROID 2013-09-22 14:11 2217人阅读 评论(0) 收藏

    参考自Google官方文档Traning/Getting Started/Building a simple user interface, Startinganother activity,http ...

  8. python implementation for Qt's QDataStream(看一下QDataStream的结构)

    #!/usr/bin/env python # -*- coding: utf- -*- from __future__ import print_function from __future__ i ...

  9. yield return

    一次被yield return坑的历程.   事情的经过是这样的: 我用C#写了一个很简单的一个通过迭代生成序列的函数. public static IEnumerable<T> Iter ...

  10. php javascript的ajax

    先说基础一点的get类型的ajax function loadXMLDoc() { var xmlhttp;//首先判断浏览器是否支持xmlhttprequest,因为ie56不是这个对象,是acti ...