BZOJ 1068 [SCOI2007]压缩

题目链接

膜拜黄学长

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char s[100];
int f[60][60][2];
bool vis[60][60][2];
bool judge(int l, int r) {
    int len = r - l + 1;
    if(len & 1) return false;
    for(int i = l; i <= (l + r) / 2; i++)
      if(s[i] != s[i + len / 2]) return false;
    return true;
}
int DP(int l, int r, bool k) {
    if(l == r) return 1;
    int & res = f[l][r][k];
    if(vis[l][r][k]) return res;
    vis[l][r][k] = true;
    res = r - l + 1;
    if(k == 1) {
        for(int i = l; i < r; i++)
          res = min(res, DP(l, i, true) + DP(i + 1, r, true) + 1);
    }
    for(int i = l; i < r; i++)
      res = min(res, DP(l, i, k) + r - i);
    if(judge(l, r)) res = min(res, DP(l, (l + r) / 2, false) + 1);
    return res;
}
int main() {
    scanf("%s", s);
    int n = strlen(s);
    printf("%d\n", DP(0, n - 1, 1));
    return 0;
}
posted @ 2018-05-20 21:43  LJZ_C  阅读(...)  评论(...编辑  收藏