添加最少括号匹配给定括号字符串

同样也是查括号匹配问题是引出的,原题好像是一道ACM吧:

给定包含'('')''['']'的一串字符串,要求出至少必须添加多少括号才能让所有括号匹配。


知道应该是用动态规划的,但想了很久也没想出做法,最后还是看了别人的分析后才实现的

动态规划数组所中的a[i][j]代表的是要让字符串索引从i到j的子字符串中括号匹配所要添加的最少括号数

而a[i][j+1]的一种可能是a[i][j]+1,即对于新进入的第j+1个括号还需要再加一个括号与之匹配

但如果a[i][j]中有与第j+1个括号匹配的括号(假设为第k个括号),即k与j+1已经匹配,则最少需要添加的括号数就等于要让除了k和j+1之外的括号匹配所要添加的最少括号数了。

而由于剩下的括号被第k个括号分成两部分了,分隔开来了,所以它们之间就算有匹配的括号也无法匹配(这也是看了别人分析后还想了很久的地方),所以就直接是两部分分别的匹配所用最少括号数相加了,即:

a[i][j+1]=a[i][k-1]+a[k+1][j]

所以

a[i][j+1]=min(a[i][j]+1,a[i][k-1]+a[k+1][j]) k属于i~j

解法如下:


#include 
#include 

using namespace std;


int main()
{
	string str;
	cin>>str;
	const unsigned int size = str.size();
	int **arr = new int*[size];
	for(unsigned int i=0;i


你可能感兴趣的:(算法)