求助区间dp
查看原帖
求助区间dp
317622
_Ad_Astra_楼主2022/8/15 08:56

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;
}
2022/8/15 08:56
加载中...