Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 107 Accepted Submission(s) : 43
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
描述 给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来。
如:
[]是匹配的
([])[]是匹配的
((]是不匹配的
([)]是不匹配的
如:
[]是匹配的
([])[]是匹配的
((]是不匹配的
([)]是不匹配的
Input
第一行输入一个正整数N,表示测试数据组数(N<=100)。
每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度不超过100。
每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度不超过100。
Output
对于每组测试数据都输出一个正整数,表示最少需要添加的括号的数量。每组测试输出占一行。
Sample Input
4 [] ([])[] ((] ([)]
Sample Output
0 0 3 2
Source
CodingTrip - 携程编程大赛 (预赛第一场)
经典dp问题,自己没想到,几个模糊的地方:
1.没严谨符号化(递归)定义
2.没找到子问题。
信息学竞赛的一个例子,定义A,B为合法括号串,则下列串也是合法的:
1.AB
2.(A)
3.[A]
好了,枚举子问题就好:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXR 110
#define INF MAXR
int dp[MAXR][MAXR];
char c[MAXR];
int need(int l, int r){
if(l>r) return 0;
if(dp[l][r]>-1) return dp[l][r];
dp[l][r]=INF;
if(l == r) return dp[l][r]=1;
if(c[l]=='['&&c[r]==']' ||
c[l]=='('&&c[r]==')')
dp[l][r]=need(l+1,r-1);
for(int k=l; k<=r; k++)
dp[l][r]=min(dp[l][r],need(l,k)+need(k+1,r));
return dp[l][r];
}
int main(){
int n;
scanf(" %d",&n);
while(n--){
memset(dp, -1, sizeof(dp));
scanf(" %s", c);
printf("%d\n",need(0,strlen(c)-1));
}
return 0;
}