题目:点击打开链接
题意:给你一个字符串,问至少添加多少个字符才能使它成为合法字符,具体的要求见题目,这道题在刘汝佳《算法竞赛入门经典第二版》278页有详细介绍
分析:我就不瞎扯了,书上写的很详细啊,需要注意的是输入串有可能是空串,用gets()接受一行字符串
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,d[105][105];
char s[105];
bool match(char a,char b)
{
if((a=='['&&b==']')||(a=='('&&b==')'))
return 1;
return 0;
}
void dp()
{
for(int i=0;i<n;i++){
d[i+1][i]=0;
d[i][i]=1;
}
for(int i=n-2;i>=0;i--)
for(int j=i+1;j<n;j++){
d[i][j]=n;
if(match(s[i],s[j]))d[i][j]=min(d[i][j],d[i+1][j-1]);
for(int k=i;k<j;k++)
d[i][j]=min(d[i][j],d[i][k]+d[k+1][j]);
}
}
void print(int i,int j)
{
if(i>j)return ;
if(i==j){
if(s[i]=='['||s[i]==']')printf("[]");
else printf("()");
return ;
}
int ans=d[i][j];
if(match(s[i],s[j])&&ans==d[i+1][j-1]){
printf("%c",s[i]);
print(i+1,j-1);
printf("%c",s[j]);
return;
}
for(int k=i;k<j;k++)
if(ans==d[i][k]+d[k+1][j]){
print(i,k);print(k+1,j);
return;
}
}
int main()
{
int T;
scanf("%d",&T);
getchar();
while(T--){
gets(s);
gets(s);
n = strlen(s);
if(n==0){
printf("\n");
if(T>0) printf("\n");
continue;
}
dp();
print(0,n-1);
printf("\n");
if(T>0) printf("\n");
}
return 0;
}