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 ] ) ;

 #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 ;
else
return ;
} int main(void)
{
int n,m,i,j,k;
char str[];
scanf("%d",&n);
while(n--)
{
scanf("%s",str);
int length = strlen(str);
memset(dp,,sizeof(dp));
for(i = ; i < length; i++)
{
dp[i][i] = ;
}
//区间dp常用dp套路
for(m = ; m < length; m++)//枚举的串长度
{
for(i = ; 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+][j-]);//消去匹配的括号
//枚举中间点
for(k = i; k < j; k++)
{
dp[i][j] = min(dp[i][j],dp[i][k]+dp[k+][j]);
}
}
}
printf("%d\n",dp[][length-]);
}
return ;
}

最新文章

  1. [No000072]Windows环境变量列表
  2. Python的MySQLdb模块安装
  3. 16进制ascii码转化为对应的字符,付ipmitool查询硬件信息
  4. Ubuntu 杂音 alsa*
  5. Mac brew命令
  6. 详细学习ORACLE JOBS
  7. POJO, DTO, VO, JavaBean的区别
  8. Unity3D研究院之脚本批量打包渠道包研究
  9. Codeforces Round #271 (Div. 2)
  10. H5发展简介
  11. PHP常见算法-面试篇(2)
  12. uedit富文本编辑器
  13. RedHat7搭建MongoDB集群
  14. 网络性能测试工具Iperf/Jperf解读
  15. BTrace:线上问题排查工具
  16. SpringMVC中post请求参数注解@requestBody使用问题
  17. Django之Models(一)
  18. HTTP各种特性
  19. Javascript中的各结构的嵌套和函数
  20. BloodHound官方使用指南

热门文章

  1. dubbo之连接控制
  2. tailf
  3. Power Designer逆向操作(从mysql5.0生成数据库的物理模型)
  4. GeckoWebBrowser设置cookie
  5. IO文件读取
  6. Haproxy 【转载】
  7. js 字符串,数组扩展
  8. Luogu P2298 Mzc和男家丁的游戏
  9. web前端学习总结--HTML
  10. 4.bool组合查询