NYOJ-15:括号匹配(二)

内存限制:64MB 时间限制:1000ms 特判: No

通过数:54 提交数:158 难度:6

题目描述:

给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来。
如:
[]是匹配的
([])[]是匹配的
((]是不匹配的
([)]是不匹配的

输入描述:

第一行输入一个正整数N,表示测试数据组数(N<=10)
每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度不超过100

输出描述:

对于每组测试数据都输出一个正整数,表示最少需要添加的括号的数量。每组测试输出占一行
样例输入:
4
[]
([])[]
((]
([)]
样例输出:
0
0
3
2

思路

dp[i][j]dp[i][j]储存iijj位置需要添加括号的数量
因为要找最小的次数,所以给dp[i][j]dp[i][j]的初始值可以设为字符串的长度(足够大就可以),当i=ji=j的时候,至多需要11个括号就能匹配了,所以初始值为11
如果当前iijj位置的括号可以匹配,那么[i,j][i,j]之间需要的括号数和[i+1,j1][i+1,j-1]的相同,所以dp[i][j]=dp[i+1][j1]dp[i][j]=dp[i+1][j-1]
然后查询[i,j][i,j]之间需要的最少括号数,dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j])dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j])

AC代码

/*************************************************************************
    > File Name: 15.cpp
    > Author: WZY
    > School: HPU 
    > Created Time: 2019年01月21日 15:18:59
 ************************************************************************/
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define ms(a,b) memset(a,b,sizeof(a))
#define pi acos(-1.0)
#define INF 0x7f7f7f7f
const double E=exp(1);
const int maxn=1e3+10;
const int mod=1e9+7;
using namespace std;
char ch[maxn];
// dp[i][j]表示从i到j位置匹配所需要添加的括号数
int dp[maxn][maxn];
bool check(char a,char b)
{
	if((a=='['&&b==']')||(a=='('&&b==')'))
		return true;
	else
		return false;
}
int main(int argc, char const *argv[])
{
	ios::sync_with_stdio(false);
	int t;
	cin>>t;
	while(t--)
	{
		cin>>ch;
		int l=strlen(ch);
		for(int i=0;i<l;i++)
		{
			dp[i][i]=1;
			dp[i+1][i]=0;
		}
		for(int i=l-2;i>=0;i--)
		{
			for(int j=i+1;j<l;j++)
			{
				dp[i][j]=l;
				if(check(ch[i],ch[j]))
					dp[i][j]=dp[i+1][j-1];
				for(int k=i;k<j;k++)
					dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]);
			}
		}
		cout<<dp[0][l-1]<<endl;
	}
	return 0;
}
posted @ 2019-01-21 16:36  友人-A  阅读(194)  评论(0编辑  收藏  举报