
最开始的想法是搜索,发现不对,后来发现数据量很小,可以状态压缩+DP。
/* 4628 */
#include <cstdio>
#include <cstring>
#include <cstdlib> #define MAXN 17
#define INF 9999 char s[MAXN];
char ss[MAXN];
int dp[<<MAXN];
int len; inline int max(int a, int b) {
return a>b ? a:b;
} inline int min(int a, int b) {
return a<b ? a:b;
} bool isPalindrome(int x) {
int i, j, l = ; for (i=, j=; i<len; ++i, j<<=)
if (x & j)
ss[l++] = s[i]; i = ;
j = l-;
while (i<=j && ss[i]==ss[j])
++i, --j;
if (i > j)
return true;
else
return false;
} int main() {
int t;
int i, j, k; #ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
#endif scanf("%d", &t);
while (t--) {
scanf("%s", s);
len = strlen(s);
for (i=; i<(<<len); ++i) {
dp[i] = INF;
if (isPalindrome(i))
dp[i] = ;
else {
for (j=i; j; j=(j-)&i)
dp[i] = min(dp[i], dp[j]+dp[i^j]);
}
}
printf("%d\n", dp[(<<len)-]);
} return ;
}