您的位置:首页 > 其它

UVALive - 3363 String Compression (区间DP)

2014-01-29 14:32 369 查看
题意:将一串字符串按照规定压缩后的最小的长度是多少

思路:在区间DP上,再注意一点就行了,就是可以考虑当自身能作为压缩的字符串的情况

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 210;
const int INF = 0x3f3f3f3f;

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

int check(int s,int t,int k){
    if ((t-s+1) % k != 0)
        return 0;
    for (int i = s+k; i <= t; i += k)
        for (int j = 0; j < k; j++)
            if (str[s+j] != str[i+j])
                return 0;
    return (t-s+1) / k;
}

int getnum(int x){
    if (x >= 0 && x <= 9)
        return 1;
    if (x >= 10 && x <= 99)
        return 2;
    return 3;
}

void solve(){
    for (int i = 0; i < n; i++)
        dp[i][i] = 1;
    int temp;
    for (int k = 2; k <= n; k++){
        for (int i = 0; i <= n-k; i++){
            dp[i][i+k-1] = INF;
            for (int j = i; j < i+k-1; j++)
                dp[i][i+k-1] = min(dp[i][i+k-1],dp[i][j]+dp[j+1][i+k-1]);
            for (int z = 1; z <= k/2; z++){
                int temp = check(i,i+k-1,z);
                if (temp)
                    dp[i][i+k-1] = min(dp[i][i+k-1],dp[i][i+z-1]+2+getnum(temp));
            }
        }
    }
}

int main(){
    int t;
    scanf("%d",&t);
    while (t--){
        scanf("%s",str);
        n = strlen(str);
        solve();
        printf("%d\n",dp[0][n-1]);
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: