1 条题解

  • 0
    @ 2025-8-24 21:38:04

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Tgotp
    **

    搬运于2025-08-24 21:38:04,当前版本为作者最后更新于2017-06-24 15:35:28,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    思路:区间dp

    具体实现:

    f[i][j][k] 代表区间 i - j 间是否存在m;

    另默认在i-1处有一个M;

    当s[mid+1,r]==s[l,mid]时,f[i][j][0] = f[i][(i+j)/2][0] + 1;

    当中间加入了M,枚举M放在哪里就可以;

    参照大佬打下的代码。

    c++代码如下:

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int f[110][110][2];
    char s[110];
    int n;
    bool check(int l,int r)
    {
        int mid =(l + r ) /    2;
        for(int i = 1;i <= mid - l + 1 ;i++) if(s[l+i-1] != s[mid+i]) return 0;
        return 1;    
    }
    int main()
    {
        scanf("%s",s+1);
        n = strlen(s+1);
        for(int i = n;i;i--)
            for(int j = i;j<=n;j++)
            {
                f[i][j][0] = f[i][j][1] = j - i + 1;
                for(int k = i;k < j ;k++) f[i][j][1] = min(f[i][j][1],min(f[i][k][0],f[i][k][1]) + 1 + min(f[k+1][j][1],f[k+1][j][0]));
                for(int k = i;k < j ;k++) f[i][j][0] = min(f[i][j][0],f[i][k][0] + j - k);
                if((j - i + 1)%2 == 0 && check(i,j)) f[i][j][0] = f[i][(i+j)/2][0] + 1;
            }
        cout<<min(f[1][n][0],f[1][n][1])<<endl;
        return 0;
    }
    推广blog:<http://tgotp.science>
    
    • 1

    信息

    ID
    1506
    时间
    1000ms
    内存
    125MiB
    难度
    6
    标签
    递交数
    0
    已通过
    0
    上传者