题目大意:给你一贯括号序列(只包含小括号和中括号),让你找出长度最小的regular brackets sequence包含此子序列.
注意有空行。细心。
代码:
#include<iostream>
#include<fstream>
#include<cstring>
using namespace std;
int dp[110][110];
char c[220];
int n;
void print(int i,int j){
int s;
if(i>j) return;
if(i==j)
{
if(c[i]=='('||c[i]==')')
{
cout<<"()";
}
if(c[i]=='['||c[i]==']')
{
cout<<"[]";
}
return;
}
if(c[i]=='('&&c[j]==')'&&dp[i][j]==dp[i+1][j-1])
{
cout<<'(';
print(i+1,j-1);
cout<<')';
return;
}
if(c[i]=='['&&c[j]==']'&&dp[i][j]==dp[i+1][j-1])
{
cout<<'[';
print(i+1,j-1);
cout<<']';
return;
}
for(s=i;s<j;s++)
if(dp[i][j]==dp[i][s]+dp[s+1][j])
{
print(i,s);
print(s+1,j);
return;
}
}
void read(){
// ifstream cin("in.txt");
int i,j,k,s,t;
gets(c);
n=strlen(c);
for(i=0;i<n;i++)
dp[i][i]=1;
for(k=1;k<n;k++)
for(i=0;i+k<n;i++)
{
j=i+k;
dp[i][j]=1000000;
if(c[i]=='('&&c[j]==')')
dp[i][j]=min(dp[i][j],dp[i+1][j-1]);
if(c[i]=='['&&c[j]==']')
dp[i][j]=min(dp[i][j],dp[i+1][j-1]);
for(s=i;s<j;s++)
dp[i][j]=min(dp[i][j],dp[i][s]+dp[s+1][j]);
}
print(0,n-1);
cout<<endl;
}
int main(){
read();
return 0;
}