HYSBZ

来源:互联网 发布:android仿淘宝头条 编辑:程序博客网 时间:2024/05/22 08:26
题目描述:

点击打开链接

中文题,不解释题意。正常的分割区间去求解,注意一种情况如果满足某一区间的字符全部相同,直接将这部分压缩即可。

AC代码:

#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<string>#include<cmath>#include<stack>#include<vector>#include<queue>#include<algorithm>using namespace std;const int MAXM=200;const long long MOD=1000000007;const int INF=0x3f3f3f3f;const double PI=acos(-1);char s[110];int dp[110][110];int cal(int x){    int res=0;    while(x)    {        x=x/10;        res++;    }    return res;}bool check(int l,int r,int L,int R){    if ((r-l+1)%(R-L+1)!=0) return false;    for (int i=l;i<=r;i++)        if (s[i]!=s[(i-l)%(R-L+1)+L]) return false;    return true;}int main(){    scanf("%s",s);    memset(dp,INF,sizeof(dp));    int len=strlen(s);    for (int i=len-1;i>=0;i--)    {        for (int j=i;j<len;j++)        {            dp[i][j]=j-i+1;            for (int k=i;k<j;k++)            {                dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]);                if (check(k+1,j,i,k))                    dp[i][j]=min(dp[i][j],dp[i][k]+2+cal((j-k)/(k-i+1)+1));            }            //cout<<dp[i][j]<<endl;        }    }    int ans=dp[0][len-1];    printf("%d\n",ans);    return 0;}