1572:括号配对

1572:括号配对

时间限制: 1000 ms 内存限制: 524288 KB
提交数: 889 通过数: 492
【题目描述】
Hecy 又接了个新任务:BE 处理。BE 中有一类被称为 GBE。

以下是 GBE 的定义:

空表达式是 GBE
如果表达式 A 是 GBE,则 [A] 与 (A) 都是 GBE
如果 A 与 B 都是 GBE,那么 AB 是 GBE。

【输入】
输入仅一行,为字符串 BE。

【输出】
输出仅一个整数,表示增加的最少字符数

【输入样例】
[])
【输出样例】
1
【提示】
数据范围与提示:

对于 100% 的数据,输入的字符串长度小于 100。

思路:
一开始思路错了,状态直接写的f[i][j]表示ij之间增加的最少字符数,不好表示,不好转移。
但是发现题目的本质是求一个最长括号配对序列(感觉题目有稍微透露这个信息),所以直接设f[i][j]表示ij之间的最长匹配括号序列,代码如下;

代码:

/*
其实这个题的实质就是求最长配对括号,剩下的不配对的直接加上相同数量的括号即可 
*/

#include<bits/stdc++.h>
using namespace std;

char a[10200];
int f[1020][1020];

int main()
{
	cin>>a+1;
	int len=strlen(a+1);
	
//	memset(f,0x3f,sizeof(f));
//	f[0][0]=0;
//	f[0][1]=1;
	
	for(int i=2;i<=len;i++)//枚举长度 
		for(int j=1;j+i-1<=len;j++)
		{
			int l=j;
			int r=j+i-1;
			if((a[l]=='['&&a[r]==']')||(a[l]=='('&&a[r]==')')) f[l][r]=max(f[l+1][r-1]+2,f[l][r]);
			for(int k=l;k<r;k++)
			{
				f[l][r]=max(f[l][r],f[l][k]+f[k+1][r]);
			}
		 } 
		 
	cout<<len-f[1][len]<<'
';
	return 0; 
}

规律总结:
发现做了三道区间dp题,每个区间dp的第一层循环不是循环分成了几部分,就是循环当前长度是多少(其实也相当于分成了几部分),之后做题会继续关注这一点,看一看是不是大部分区间dp的规律
-----------------随时更新哦~~-------------------

原文地址:https://www.cnblogs.com/yxr001002/p/14433136.html