一开始以为R必须连续,敲了一发,结果发现样例1挂了...然后看了【hzwer的题解】,原来要这么写= =
/* Telekinetic Forest Guard */
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 55, inf = 0x3f3f3f3f;
int dp[maxn][maxn][2];
char s[maxn];
inline bool check(int l, int r) {
if((r - l + 1) & 1) return 0;
int len = (r - l + 1) >> 1;
for(int i = 1; i <= len; i++) if(s[l + i - 1] != s[l + i - 1 + len]) return 0;
return 1;
}
inline int dfs(int l, int r, bool f) {
if(l == r) return 1;
if(dp[l][r][f]) return dp[l][r][f];
int res = r - l + 1;
if(f) for(int i = l; i < r; i++) res = min(res, dfs(l, i, 1) + 1 + dfs(i + 1, r, 1));
for(int i = l; i < r; i++) res = min(res, dfs(l, i, f) + r - i);
if(check(l, r)) res = min(res, 1 + dfs(l, (l + r) >> 1, 0));
return dp[l][r][f] = res;
}
int main() {
scanf("%s", s + 1);
printf("%d\n", dfs(1, strlen(s + 1), 1));
return 0;
}