uva 10651
DP 主要是位运算的运用 因为只有12位 用一个数字代表一种装态 记忆化搜索 节约时间
/************************************************************************* > Author: xlc2845 > Mail: xlc2845@gmail.com > Created Time: 2013年11月06日 星期三 13时01分11秒 ************************************************************************/ #include <iostream> #include <algorithm> #include <set> #include <cstdio> #include <cstring> #define maxn 5000 using namespace std; int num[maxn]; bool vis[maxn]; char str[15]; int dp(int x) { if(vis[x]) return num[x]; int _min = 0; for(int i = 0; i < 12; i++) if(x&(1 << i)) _min++; for(int i = 0; i < 12; i++) { if(x&(1 << i) && x&(1 << (i+1))) { if(i > 0 && (x&(1 << (i-1))) == 0) _min = min(_min, dp(x^(1 << (i-1))^(1 << i)^(1 << (i+1)))); if(i < 10 && (x&(1 << (i+2))) == 0) _min = min(_min, dp(x^(1 << i)^(1 << (i+1))^(1 << (i+2)))); } } vis[x] = true; num[x] = _min; return _min; } int main() { int t; scanf("%d",&t); while(t--) { memset(num, 0, sizeof(num)); memset(vis, 0, sizeof(vis)); scanf("%s",str); int len = strlen(str), k=0; for(int i = 0; i < len; i++) { if(str[i] == 'o') k ^= 1 << i; } printf("%d\n",dp(k)); } return 0; }