【bzoj1068】[SCOI2007]压缩

来源:互联网 发布:如何在mac上玩dota2 编辑:程序博客网 时间:2024/06/05 04:48

题目链接:传送门
题解:
f[l][r][0/1]表示l到r是否使用M能压缩成的最小值,记忆化搜索,比较麻烦

//by sdfzchy#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;typedef long long LL;const int inf=(1<<30),N=100010,mod=1e9+7;int n,m;inline int in(){    char tmp=getchar();    int res=0,f=1;    while((tmp<'0'||tmp>'9')&&tmp!='-')tmp=getchar();    if(tmp=='-') f=-1,tmp=getchar();    while(tmp>='0'&&tmp<='9')   res=(res<<1)+(res<<3)+(tmp^48),tmp=getchar();    return res*f;}int f[120][120];char s[120];int cal(int x){    int ret=0;    while(x) ret++,x/=10;    return ret;}bool ok(int l,int r,int k){    for(int i=k+1;i<=r;i++)        if(s[l+(i-l)%(k-l+1)]!=s[i]) return 0;    return 1;}int main(){    scanf("%s",s+1);    n=strlen(s+1);    for(int i=1;i<=n;i++) f[i][i]=1;    for(int i=1;i<n;i++)        for(int l=1,r=l+i;r<=n;l++,r++)        {            f[l][r]=r-l+1;            for(int k=l;k<r;k++)            {                f[l][r]=min(f[l][r],f[l][k]+f[k+1][r]);                if((r-k)%(k-l+1)==0&&ok(l,r,k)) f[l][r]=min(f[l][r],f[l][k]+2+cal((r-l+1)/(k-l+1)));            }        }    printf("%d",f[1][n]);    return 0;}