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  阅读(61)  评论(0编辑  收藏