• bzoj 1068: [SCOI2007]压缩


    做之前可以先做一下这题 http://www.lydsy.com/JudgeOnline/problem.php?id=1090

    本来是想做一道区间DP的

    然而太弱 并没有很快理解如何用传统区间DP(区间合并)来写这题

    于是先用自己yy的比较水的方法做了一遍(其实也就是模拟题意中的压缩操作)

    用$f[i][j]$表示 现在原串处理好了第$i$位 且缓冲串长度为$j$时的最小花费

    那么$f[i][j]$可以从这三种情况转移过来

    $f[i-1][j-1]+1$(填原字母)

    $f[i-j/2][j/2]+1$(填R,j为偶数)

    $f[i][k]+1$(填M,j=0)

    于是这样就可以先水过(注意$j$的一个比较粗略的上界是$2i$)

    #include <bits/stdc++.h>
    using namespace std;
    char s[60];
    int f[60][110];
    int n,ans;
    bool check(int L,int R)
    {
        int len=R-L+1;
        for(int i=L;i<=R;++i)
            if(s[i]!=s[i-len])
                return 0;
        return 1;
    }
    int main()
    {
        memset(f,0x3f,sizeof(f));
        scanf("%s",&s[1]);
        n=strlen(&s[1]);
        f[0][0]=0;
        for(int i=1;i<=n;++i)
        {
            for(int j=max((i-1)*2,1);j;--j)
            {
                f[i][j]=f[i-1][j-1]+1;
                if((j&1)==0&&check(i-j/2+1,i))
                    f[i][j]=min(f[i][j],f[i-j/2][j/2]+1);
                f[i][0]=min(f[i][0],f[i][j]+1);
            }
        }
        ans=f[n][0];
        for(int i=n*2;i;--i)
            ans=min(ans,f[n][i]);
        printf("%d
    ",ans);
        return 0;
    }

    先把这个坑挖着 以后会了再来用传统区间DP方法来填坑

  • 相关阅读:
    为什么ip层收到的报文可能已经设置了路由
    由socket fd泄漏想到的一些问题
    Html.DropDownLis绑定数据库
    CSS 属性备注
    获取IP
    读取TXT并筛选数据写入新建TXT
    C#打印图片
    C#生成二维码
    NPOI操作Excel
    Bootstrap
  • 原文地址:https://www.cnblogs.com/sagitta/p/4777297.html
Copyright © 2020-2023  润新知