您的位置:首页 > 其它

DP与位运算的结合

2016-05-15 20:09 274 查看
uva10651

代码:

#include <iostream>
using namespace std;
#include <cstring>
#include <stdio.h>

char str[15];
int a;
int vis[4100];
int _min;

bool check(int i,int j) {
if((j & (1 << (i - 1))) && (j & (1 << i)) && !(j & (1 << (i + 1))))
return true;
if(!(j & (1 << (i - 1))) &&(j & (1 << i)) &&(j &(1 << (i + 1))))
return true;
return false;
}
void dp(int k) {

//cout << "1 ";
if(vis[k])
return;
//vis[k] = 1;
for(int i = 1; i <= 10; i++) {
int st = k;
if(check(i,k)) {
st ^= (1 << (i - 1));
st ^= (1 << i);
st ^= (1 << (i + 1));
dp(st);
}
}
int cnt = 0;
for(int i = 0; i < 12; i++)
if(k &(1 << i))
cnt++;
_min = min(_min,cnt);
vis[k] = cnt;
}
int main() {

int T;
scanf("%d",&T);
getchar();
while(T--) {
gets(str);
//cout << str<<endl;
int a= 0 ;
for(int i = 0; i < strlen(str); i++) {
if(str[i] == 'o')
a|= (1 << i);
}
_min =13;
dp(a);
memset(vis,0,sizeof(vis));
// _min = 13;
/*  for(int i = 0; i < 12; i++)
_min = min(_min,vis[i]);*/
printf("%d\n",_min);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: