CodingTrip - 携程编程大赛 (预赛第一场) :1002 括号匹配



括号匹配

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。

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;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值