Twenty Questions UVA

来源:互联网 发布:河南省农产品出口数据 编辑:程序博客网 时间:2024/05/05 07:04

按照紫书的思路递归求解即可,注意要找出最坏情况下的最好情况,具体实现见如下代码:

#include<iostream>#include<vector>#include<string>#include<set>#include<stack>#include<queue>#include<map>#include<algorithm>#include<cmath>#include<iomanip>#include<cstring>#include<sstream>#include<cstdio>#include<deque>using namespace std;int m, n;int dp[1<<12][1<<12],features[150];int getResult(int s1,int s2){if (dp[s1][s2] != -1) return dp[s1][s2];int amount = 0;for (int i = 0; i < n; i++){if ((s1&features[i])==s2) amount++;}if (amount <= 1){dp[s1][s2] = 0;return dp[s1][s2];}dp[s1][s2] = 1 << 30;for (int i = 0; i < m; i++){if (s1&(1 << i)) continue;dp[s1][s2] = min(dp[s1][s2], max(getResult(s1 | (1 << i), s2), getResult(s1 | (1 << i), s2 ^ (1 << i))) + 1);}return dp[s1][s2];}int main(){while (cin >> m >> n&&m&&n){string s;memset(features,0,sizeof(features));memset(dp,-1,sizeof(dp));for (int i = 0; i < n; i++){cin >> s;for (int j = 0; j < m; j++){if(s[j]!='0')    features[i]|=(1<<j);}}cout << getResult(0, 0) << endl;}return 0;}