括号匹配
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 76 Accepted Submission(s) : 32
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,欠缺的说。。。
# include<iostream>
# include<cstdio>
# include<cstdlib>
# include<cstring>
# include<algorithm>
# include<cmath>
# include<string>
# include<cctype>
# include<set>
# include<map>
# include<stack>
# include<queue>
# include<vector>
# include<numeric>
#include <sstream>
using namespace std;
const int MAXSIZE=110;
const double inf=0.000001;
const int INF=~0U>>1;
const int mod=1000000007;
# define PI (acos(0)*2.0)
#define m0(a) memset(a,0,sizeof(a))
#define m1(a) memset(a,-1,sizeof(a))
typedef long long ll;
class B{
private:
int ans, len;
string str;
int dp[MAXSIZE][MAXSIZE];
//string a[MAXSIZE], b[MAXSIZE], word[MAXSIZE];
public:
void initialize();
void readCase();
void computing();
void outResult();
};
void B::initialize(){
m0(dp);
for(int i=0; i<=len; i++){
dp[i][i] = 1;
}
}
void B::readCase(){
cin >> str;
len = str.length();
initialize();
}
int match(char le, char ri){
if(le == '[' && ri == ']'){
return 1;
}
if(le == '(' && ri == ')'){
return 1;
}
return 0;
}
void B::computing(){
for(int i = 2; i<=len; i++){
for(int j = i-1; j>=1; j--){
dp[j][i] = dp[j][i-1] + 1;
for(int k = j; k < i; k++){
if(match(str[k-1], str[i-1])){
dp[j][i] = min(dp[j][i], dp[j][k-1] + dp[k+1][i-1]); //状态转移方程,逻辑要清晰哦~
}
}
}
}
}
void B::outResult(){
cout<<dp[1][len]<<endl;
}
int main(){
int T;
cin >> T;
getchar();
//int i = 1;
while(T--){
B b;
b.readCase();
b.computing();
//cout<<"Case #"<<i++<<": ";
b.outResult();
}
return 0;
}