题目链接
膜拜黄学长
#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;
}