位运算+记忆化搜索
#include <algorithm> #include <cstdio> #include <cmath> #include <cstring> #include <queue> using namespace std; int dp[5000]; int dfs(int x) { if(dp[x]!=-1) return dp[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)))) { int t=x^(1<<i); t^= 1<<(i+1); t^= 1<<(i-1); _min=min(_min,dfs(t)); } if(i<10 && !(x&(1<<(i+2)))) { int t=x^(1<<i); t^= 1<<(i+1); t^= 1<<(i+2); _min=min(_min,dfs(t)); } } } dp[x]=_min; return _min; } int main() { int t; char s[15]; scanf("%d",&t); while(t--) { memset(dp, -1, sizeof(dp)); scanf("%s",s); int ans=0; int len=strlen(s); for(int i=0; i<len; ++i) if(s[i]=='o') ans ^= 1<<i; printf("%d\n",dfs(ans)); } return 0; }