RT.
POJ1141这道几乎一样的题过了,UVA上WA了
#include <iostream>
#include <cstring>
using namespace std;
// #define int long long
#define fir first
#define sec second
#define chmax(a,b) a=max(a,b)
#define chmin(a,b) a=min(a,b)
// const int inf=0x3f3f3f3f3f3f3f3f;
const int inf=0x3f3f3f3f;
int n,dp[110][110];
string a,ans[110][110];
int solve(int l,int r)
{
// cout<<l<<" "<<r<<" "<<a[l]<<" "<<a[r]<<endl;
if(dp[l][r]!=inf)return dp[l][r];
// cout<<"---------"<<endl;
if(l==r)
{
if(a[l]=='('||a[l]==')')ans[l][r]="()";
else ans[l][r]="[]";
// cout<<l<<" "<<r<<" "<<ans[l][r]<<endl;
return dp[l][r]=1;
}
if(l+1==r)
{
if(a[l]=='('&&a[r]==')'||a[l]=='['&&a[r]==']')
{
ans[l][r]+=a[l];
ans[l][r]+=a[r];
// cout<<l<<" "<<r<<" "<<ans[l][r]<<endl;
return dp[l][r]=0;
}
if(a[l]==')'||a[l]=='(')ans[l][r]+="()";
if(a[l]==']'||a[l]=='[')ans[l][r]+="[]";
if(a[r]==')'||a[r]=='(')ans[l][r]+="()";
if(a[r]==']'||a[r]=='[')ans[l][r]+="[]";
// cout<<l<<" "<<r<<" "<<ans[l][r]<<endl;
return dp[l][r]=2;
}
if(a[l]=='('&&a[r]==')'||a[l]=='['&&a[r]==']')
{
// cout<<"!!!"<<l<<" "<<r<<endl;
dp[l][r]=solve(l+1,r-1);
ans[l][r]=a[l]+ans[l+1][r-1]+a[r];
// cout<<"0 "<<l<<" "<<r<<" "<<dp[l][r]<<" "<<ans[l][r]<<endl;
}
for(int i=l;i<r;i++)
{
int lans=solve(l,i),rans=solve(i+1,r);
if(lans+rans<dp[l][r])
{
dp[l][r]=lans+rans;
ans[l][r]=ans[l][i]+ans[i+1][r];
}
// cout<<i<<" "<<l<<" "<<r<<" "<<lans+rans<<" "<<ans[l][i]+ans[i+1][r]<<endl;
}
// cout<<l<<" "<<r<<" "<<ans[l][r]<<endl;
return dp[l][r];
}
void solve()
{
cin>>a;
n=a.size();
a=' '+a;
// cout<<a<<endl;
memset(dp,0x3f,sizeof(dp));
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++)
ans[i][j]="";
solve(1,n);
cout<<ans[1][n]<<endl;
}
signed main()
{
int t;
cin>>t;
while(t--)
{
solve();
if(t)cout<<endl;
}
return 0;
}