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;
}