slongle
11/21/2017 - 2:14 PM

UVa 1351 - String Compression

UVa 1351 - String Compression

#include <bits/stdc++.h>
using namespace std;

typedef long long LL;
const int MAXN=200+5;
const int MAXM=1e5+5;
const int mod=1e9+7;

int n,dp[MAXN][MAXN];
char x[MAXN];

int dig(int a){
    int b=0;
    while(a){
        b++;
        a/=10;
    }
    return b;
}

int check(int l,int r,int len){
    for(int i=1;i<=len;i++){
        int tag=1,p=l+i-1+len;
        while(p<=r){
            if (x[p]!=x[l+i-1]){
                tag=0;
                break;
            }
            p+=len;
        }
        if (tag==0) return 0;
    }
    return 1;
}

int fff(){
    int a=1;
}
int main(){
    int aa; scanf("%d",&aa);
    while(aa--){
        scanf(" %s",x+1); n=strlen(x+1);
        for(int i=1;i<=n;i++){
            if (i==20) fff();   
            for(int j=1;j<=n-i+1;j++){
                int l=j,r=j+i-1;
                dp[l][r]=i;
                for(int k=l;k<=r;k++)
                    dp[l][r]=min(dp[l][r],dp[l][k]+dp[k+1][r]);
                for(int k=1;k<i;k++)
                    if (i%k==0 && check(l,r,k)==1){
                        dp[l][r]=min(dp[l][r],dp[l][l+k-1]+dig(i/k)+2);
                    }
            }
        }
        printf("%d\n",dp[1][n]);
    }
    return 0;
}