括号序列
题目描述
定义如下规则序列(字符串):
1.空序列是规则序列;
2.如果S是规则序列,那(S)和[S]也是规则序列;
3.如果A和B都是规则序列,那么AB也是规则序列。
例如,下面的字符串都是规则序列:
(), [], (()), ([]), ()[], ()[()]
这几个不是规则序列:
(, [, ], )(, ([()
现在,给出一些有’(’ , ‘)’ , ‘[’ , ‘]’组成的序列,请添加尽量少的括号,得到一个规则序列,并输出该序列的长度。
输入
输入一个有’(’ , ‘)’ , ‘[’ , ‘]’组成的序列,长度不超过200
输出
输出规则后的字串长度
样例输入
([(]
样例输出
6
枚举长度;
若可以匹配f[i][j]=min(f[i+1][j-1],f[i][j]);
若不行f[i][j]=min(f[i][j],f[i+1][j]+1,f[i][j-1]+1);判断括号在哪一边来匹配
ps:就算可以匹配,也要与第二种比较
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
int f[300][300];
int main()
{
string str;
cin>>str;
int n=str.size();
for (int i=0;i<=n;++i)
for (int j=0;j<=n;++j)
f[i][j]=0;
for (int i=0;i<=n;++i)
f[i][i]=1;
for (int p=1;p<=n-1;++p)
for (int i=1;i<=n-p;++i)
{
int j=i+p;
f[i][j]=0x7fffffff;
if ((str[i-1]=='('&& str[j-1]==')')||(str[i-1]=='[' && str[j-1]==']'))
f[i][j]=min(f[i+1][j-1],f[i][j]);
f[i][j]=min(f[i][j-1]+1,f[i][j]);
f[i][j]=min(f[i+1][j]+1,f[i][j]);
for (int k=i;k<j;++k)
f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]);
}
cout<<f[1][n]+n<<endl;
//system("pause");
}