社区讨论

90pts WA on #6 求条玄关

P4302[SCOI2003] 字符串折叠参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mk8bejo3
此快照首次捕获于
2026/01/10 21:02
2 个月前
此快照最后确认于
2026/01/13 22:35
2 个月前
查看原帖
rt
CPP
#include<bits/stdc++.h>
using namespace std;
string a;
int n;
string dp[105][105];
string tostring(int x)
{
    string t="";
    while(x!=0)
    {
        t=char(x%10+'0')+t;
        x/=10;
    }
    return t;
}
int main()
{
    cin>>a;
    n=a.size();
    a="#"+a;
    for(int i=1;i<=n;i++)
    {
        dp[i][i]=a[i];
    }
    for(int i=2;i<=n;i++)
    {
        for(int j=1;j<=n-i+1;j++)
        {
            int l=j,r=j+i-1;
            string ans;
            int minn=INT_MAX;
            for(int k=l+1;k<=r;k++)
            {
                if(dp[l][k-1].size()+dp[k][r].size()<minn)
                {
                    minn=dp[l][k-1].size()+dp[k][r].size();
                    ans=dp[l][k-1]+dp[k][r];
                }
            }
            int ttt=0;
            for(int k=i;k>=2;k--)
            {
                if(i%k==0)
                {
                    string t;
                    for(int x=l;x<r;x+=i/k)
                    {
                        if(x==l)
                        {
                            t=dp[x][x+i/k-1];
                        }
                        else if(dp[x][x+i/k-1]!=t)
                        {
                            t="114514";
                            break;
                        }
                    }
                    // if(k==5)
                    // {
                    //     cout<<t<<endl<<endl<<endl;
                    // }
                    if(t!="114514")
                    {
                        int tt;
                        if(k>=100)
                        {
                            tt=3;
                        }
                        else if(k>=10)
                        {
                            tt=2;
                        }
                        else
                        {
                            tt=1;
                        }
                        if(minn>=tt+2+t.size())
                        {
                            dp[l][r]=tostring(k)+"("+t+")";
                            ttt=1;
                            break;
                        }
                        else
                        {
                            dp[l][r]=ans;
                            ttt=1;
                            break;
                        }
                    }
                }
            }
            if(ttt==0)
            {
                dp[l][r]=ans;
            }
            //cout<<l<<" "<<r<<" "<<dp[l][r]<<endl;
        }
    }
    cout<<dp[1][n].size();
    return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...