Petrozavodsk Winter-2018. Jagiellonian U Contest E.Guessing Game【三进制状压DP】

题意:和UVA1252一样,n个长为k的01串,问最优策略下最多猜几次就可以知道是哪个串;

分析:UVA那个题k是11,刚好可以暴搜,但是这个题是13,就要想想状压DP,但这个每一位有三种状态,已定为1,已定为2,未定,所以就是三进制下的状压DP,就可以先预处理出所有状态三进制下每一位的值和3^i(p[i]);读入过程中处理记下出现的状态,记下个数为1,然后扫所有状态,比如状态i的第j位是2,表示这一位未知,那么满足这个状态的数量就是状态(i-p[j])和(i-p[j]*2),就表示第j位已知是1或0的和,处理完之后进行状态转移,碰到状态的未知位置时可以从该位置已知为1或0转移来,结果要再加一,因为判断这一位是1还是0还需要一次操作,更新转移到最后一个状态就是答案;

#include
#define INF 0x3f3f3f3f
#define pb push_back
using namespace std;
typedef long long ll;
const int maxn=1600000;
const int mod=1e9+7;
char s[20];
int p[15],val[maxn][14];
int num[maxn],a[15],dp[maxn];
void init()
{
    p[0]=1;
    for(int i=1;i<14;i++) p[i]=3*p[i-1];
    for(int i=0;i

 

你可能感兴趣的:(DP,状压DP)