括号匹配(二)

时间限制:1000 ms  |  内存限制:65535 KB
难度:6
描述
给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来。
如:
[]是匹配的
([])[]是匹配的
((]是不匹配的
([)]是不匹配的
输入
第一行输入一个正整数N,表示测试数据组数(N<=10)
每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度不超过100
输出
对于每组测试数据都输出一个正整数,表示最少需要添加的括号的数量。每组测试输出占一行
样例输入
4
[]
([])[]
((]
([)]
样例输出
0
0
3
2
分析题目:
用 dp[j][i] 表示从位置 j 到字符位置 i 所需的最少括号数(i > j),那么这一状态可由下面得到:
1.如果 第j个字符到第i - 1个字符中没有与第i个字符匹配的括号,则所需的括号数加1,
        即:f[j][i] = f[j][i - 1] + 1;
2.如果 k=j 时正好匹配则  因为dp[j][j-1]=0,这就是第一次匹配(注意可能存在多个字符与之匹配,即可能存在多个k) ;                 
        即:dp[j][i]=min(dp[j][i],dp[k+1][i-1]);
3.如果 第k(j < k < i)个字符再次与第i个字符匹配,那么所需括号数为第j到第k - 1个字符所需字符数加上第k + 1个字符到第i - 1个字符  ,所需括号数为
        即:dp[j][i] = min(dp[j][i], dp[j][k - 1] + dp[k + 1][i - 1])。
  例如:这种情况 [ ) ) [ ( ( [ ) ) ] 当 i 为 len-1 时
              1     2     3        1为第一次匹配,2为第二次匹配。。。
AC代码一:
 //第二种情况,和第三种合并为了一种,因为dp[j][j-1]=0;
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
bool f(char a,char b)
{
if(a=='('&&b==')')
return ;
if(a=='['&&b==']')
return ;
return ;
}
int dp[][];
int main()
{
int n ;
cin>>n;
while(n--)
{
string s;
cin >> s;
int len = s.length();
memset(dp,,sizeof(dp));
for(int i = ; i <= len ; i++)
dp[i][i]=;
for(int i = ; i < len ; i++){
for(int j = i- ; j >= ; j--)
{
dp[j][i] = dp[j][i-] + ;
for(int k = j ; k < i ; ++ k)
{
if(f(s[k],s[i]))//当k=j时,为第一次与s[i]匹配;
{
dp[j][i]=min(dp[j][i],dp[j][k-]+dp[k+][i-]);
}
}
}
}
printf("%d\n",dp[][len-]);
}
return ;
}

AC代码二:

 #include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
using namespace std;
#define N 101
#define MAX 0xfffffff
int dp[N][N];
int min(int a,int b)
{
return a<b ? a:b;
}
int main()
{
int t,len,i,j,l,k,mmin,s;
char a[N];
scanf("%d",&t);
while(t--)
{
cin>>a;
len = strlen(a);
memset(dp,,sizeof(dp));
for(i=;i<len;i++)
dp[i][i]=; //一个括号需要加一个括号才能被匹配成功
for(i=;i<len;i++)
for(j=;j<len-i;j++)
{
k=j+i; mmin=MAX;
dp[j][k]=MAX;
if( ( a[j]=='(' && a[k]==')' ) || ( a[j]=='['&&a[k]==']' ) ) //如果匹配,则无需添加括号
dp[j][k]=dp[j+][k-];
//局部最小
for(l=j;l<=k;l++) //如果不需要,就找到添加的位置
{
mmin = min(mmin,dp[j][l]+dp[l+][k]);
}
//整体最小
dp[j][k]=min(dp[j][k],mmin);
}
printf("%d\n",dp[][len-]);
}
return ;
}

nyoj 15 括号匹配(2)的更多相关文章

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

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

  2. nyoj 15 括号匹配(二) (经典dp)

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

  3. nyoj 15 括号匹配(二)动态规划

    当时看到(二)就把(一)做了, 一很容易,这道题纠结了好几天,直到今晚才看懂别人的代码谢,勉强才写出来.................... 不愧是难度6的题. #include <stdio ...

  4. NYOJ 题目15 括号匹配(二)(区间DP)

    点我看题目 题意 : 中文题不详述. 思路 : 本来以为只是个小模拟,没想到是个区间DP,还是对DP不了解. DP[i][j]代表着从字符串 i 位置到 j 位置需要的最小括号匹配. 所以初始化的DP ...

  5. 南阳理工大学oj 题目15 括号匹配(二)

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

  6. 南阳理工OJ 15 括号匹配

    思路:动态规划,设dp[i][j]表示第i个字符到第j个字符所需要的最少匹配数,则:(1),如果从第i到j-1个字符中没有一个与第j个字符匹配,那么状态转移方程为 dp[i][j] = dp[i][j ...

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

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

  8. NYOJ - 括号匹配(二)(经典dp)

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

  9. DP_括号匹配序列问题

    括号匹配问题 简单括号匹配问题是给出字符串,判断字符串中的括号是否匹配,此类问题核心解决方案就是利用栈的后进先出的特性,从左到右依次遍历字符串,遇左括号进栈,遇右括号将其与栈顶元素配对,若能配对,则栈 ...

随机推荐

  1. C++构造函数、析构函数、虚析构函数

    1.构造函数 C++中的构造函数是用于初始化类的各种变量以及分配资源等.主要的注意事项是: (1)在继承关系中先初始化父类对象后初始化子类对象. (2)在一个类中按照变量的声明顺序,对类中的变量进行初 ...

  2. C++实现委托机制(二)

    1.引言: 上一篇文章已经介绍了如何构建一个无参数无返回值的函数指针的委托,这篇文章将对上一文章所述委托进行扩展,使得可以注册任意函数指针,不过再讲篇内容之前先要介绍一下实现这个功能所需要了解的C++ ...

  3. java学习笔记2--数据类型、数组

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note2.html,转载请注明源地址. 1.数据类型 Java数据类型有: 原始数据类型(Pr ...

  4. 百度地图API画多边型,测面积

    效果: 脚本: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www ...

  5. Windows Xp不用安装软件管理多个远程桌面连接

    一直使用系统默认的Mstsc来进行远程连接,但如果要连接N个远程的话就比较麻烦 之前也找过第三方的管理软件如:mRemoteNG 此软件有优点就不说了,但我在使用此软件时有一个很大的问题,就是如果一个 ...

  6. [Algorithm] Reverse array of Chars by word

    For example we have: ["p", "r", "e", "f", "e", &qu ...

  7. Python requests 报错解决集锦

    python版本号和ssl版本号都会导致 requests在请求https站点时候会出一些错误,最好使用新版本号. 1 Python2.6x use requests 一台老Centos机器上跑着古老 ...

  8. PHP 图像因其本身有错无法显示怎么办

    1 先确认自己的PHP和GD库版本够高,根据PHP手册的要求,PHP最好高于4.0.6,GD库要求2.0.1 2 对于使用PHPNOW的用户,在首页就可以找到相关信息 3 你也可以运行以下代码来检测是 ...

  9. [每日一题] OCP1z0-047 :2013-08-25 正则表达式REGEXP_LIKE-----‘harddisks’.................108

    正确答案:AB A. 'hard+.s'能够匹配harddisks,以hard开头,其中表达式的d+号代表任意个d(至少出现一次d),“.”代表除了换行符之外的任意字符, 可以代表d和s之间的&quo ...

  10. UNIX网络编程读书笔记:TCP输出、UDP输出和SCTP输出

    TCP输出 下图展示了应用进程写数据到TCP套接口的过程. 每一个TCP套接口有一个发送缓冲区,我们可以用SO_SNDBUF套接口选项来改变这个缓冲区的大小. 当应用进程调用write时,内核从应用进 ...