括号匹配(二)

时间限制: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])

#include <stdio.h>
#include <string.h> #define min(x,y) (x < y ? x : y)
#define MAX 101 int dp[MAX][MAX]; bool cmp(int n,int m)
{
if((n == '('&&m == ')')||(n == '['&&m == ']'))
return 1;
else
return 0;
} int main(void)
{
int n,m,i,j,k;
char str[101];
scanf("%d",&n);
while(n--)
{
scanf("%s",str);
int length = strlen(str);
memset(dp,0,sizeof(dp));
for(i = 0; i < length; i++)
{
dp[i][i] = 1;
}
for(m = 1; m < length; m++)
{
for(i = 0; i < length - m; i++)
{
j = i + m;
dp[i][j] = MAX;
if(cmp(str[i],str[j]))
dp[i][j] = min(dp[i][j],dp[i+1][j-1]);
for(k = i; k < j; k++)
{
dp[i][j] = min(dp[i][j],dp[i][k]+dp[k+1][j]);
}
}
}
printf("%d\n",dp[0][length-1]);
}
return 0;
}

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. VSX(翻译)Moving Code Blocks Among Code Regions using VS 2010 Extensions

    Moving Code Blocks Among Code Regions using VS 2010 Extensions (翻译)使用VS 2010 扩展性将代码块移至Region区域中 Down ...

  2. 【例题3-1 UVA - 272 】TEX Quotes

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 大水题. 用一个int记录遇到的是左括号还是右括号. [错的次数] 在这里输入错的次数 [反思] 在这里输入反思 [代码] #inc ...

  3. Solving the Problem of Overfitting

    The Problem of Overfitting Cost Function Regularized Linear Regression Note: [8:43 - It is said that ...

  4. 怎样实现iMessage群发

    怎样实现iMessage群发 Apple公司全线在mac os与ios两个操作系统上内置了FaceTime与iMessage两个应用.完美替代运营商的短信与电话.并且FaceTime与iMessage ...

  5. 【9201】&&【a201】明明的随机数

    Time Limit: 10 second Memory Limit: 2 MB 问题描述 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整 ...

  6. 从show slave status 中1062错误提示信息找到binlog的SQL

    mysql> show slave status\G *************************** 1. row *************************** Slave_I ...

  7. ASP.NET 生命周期及管道事件

    Client(发送报文:请求行+请求头+空行+请求体) <------ Http 协议 ------> Server,由 Http.sys 监听 Http 请求 -> WAS+Met ...

  8. RESET MASTER 和RESET SLAVE 命令的使用方法 注意事项

    RESET MASTER 删除所有index file 中记录的所有binlog 文件,将日志索引文件清空,创建一个新的日志文件,这个命令通常仅仅用于第一次用于搭建主从关系的时的主库,注意  rese ...

  9. hdu 1558 Segment set (并查集)

    Segment set Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  10. Framework for Graphics Animation and Compositing Operations

    FIELD OF THE DISCLOSURE The subject matter of the present disclosure relates to a framework for hand ...