zzzyc

导航

[SCOI2003]字符串折叠

 

一道蛮好玩的区间DP。。。其实只要做好check。。。然后统计答案就好了。。。QAQ。。。

呆码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

char ch[110];
int n,f[110][110];

inline bool check(int x1,int y1,int x2,int y2)
{
    if((y2-x1+1)%(y1-x1+1)!=0) return 0;
    int len=y1-x1+1;
    for(int i=x2;i<=y2;i++)
        if(ch[i-len]!=ch[i])
            return 0;
    return 1;
}

inline int num(int x)
{
    int sum=0;
    while(x)
    {
        sum++;
        x/=10;
    }
    return sum;
}

int main()
{
    scanf("%s",ch+1);
    n=strlen(ch+1);
    for(int i=1;i<=n;i++) f[i][i]=1;
    for(int i=n-1;i>=1;i--)
        for(int j=i+1;j<=n;j++)
        {
            f[i][j]=j-i+1;
            for(int k=i;k<=j;k++)
            {
                if(check(i,k,k+1,j)) f[i][j]=min(f[i][j],f[i][k]+2+num((j-i+1)/(k-i+1)));
                else f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]);
            }
        }
    printf("%d\n",f[1][n]);
}
代码

 

posted on 2018-07-13 07:31  zzzyc  阅读(105)  评论(0编辑  收藏  举报