括号匹配(二)
时间限制:1000 ms | 内存限制:65535 KB
难度:6
- 描述
- 给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来。
如:
[]是匹配的
([])[]是匹配的
((]是不匹配的
([)]是不匹配的- 输入
- 第一行输入一个正整数N,表示测试数据组数(N<=10)
每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度不超过100 - 输出
- 对于每组测试数据都输出一个正整数,表示最少需要添加的括号的数量。每组测试输出占一行
- 样例输入
-
4 [] ([])[] ((] ([)]
- 样例输出
-
0 0 3
2
-
# include <stdio.h> # include <string.h> int min(int a, int b) { return a<b?a:b; } bool match(char a, char b) { if((a=='(' && b==')') || (a=='['&&b==']')) return true; return false; } int main() { int t, len, n, i, imin, j, k, dp[102][102]; scanf("%d",&t); char s[102]; while(t--) { memset(dp, 0, sizeof(dp)); scanf("%s",s); n = strlen(s); for(i=0; i<n; ++i)//初始化 dp[i][i] = 1; for(len=1; len<n; ++len)//枚举区间长度 for(i=0; i+len<n; ++i) { imin = 999999999; if(match(s[i],s[i+len])) imin = dp[i+1][i+len-1]; for(k=i; k<i+len; ++k)//找出最小值 imin = min(imin,dp[i][k]+dp[k+1][i+len]); dp[i][i+len] = imin; } printf("%d\n",dp[0][n-1]); } return 0; }

浙公网安备 33010602011771号