题目链接:uva 1252 - Twenty Questions
题目大意:给出m和n,表示有n个长度为m且由01组成的字符串,要求询问k个位置,以区分这n个字符串,每次询问一个位置,将会得到该位置的字符,注意询问k次的位置并非固定:
例:5 4
10100
11000
00001
00010
ans = 2;询问了第1个位置后,区分开了(1)(2)和(3)(4),然而区分(1)(2)只要询问2或者3即可,区分(3)(4)只要询问4或者5即可。
解题思路:记忆化搜索,dp[x][y]表示区分 询问了x(二进制)这几个位置后状态为y的最优次数,每次需要遍历一遍字符串,计算当前有多少个字符串满足询问x状态为y,如果小于等于1即不用再询问就可以区分了;否则要枚举还没询问的位置,然后取max(solve(x|(1<
#include#include #include using namespace std; const int N = 150; const int M = 12; const int INF = 0x3f3f3f3f; int n, m, dp[1<