Это проблема в соревновании по программированию, где я «нашел», как пройти через состояния за 2 -игровые игры.
Проблема заключается в следующем: между двумя игроками A и B разыгрывается альтернативная игра, где A всегда начинает первым и выбирает несколько букв из заданной матрицы и составляет слова из заданного словаря. Затем эти буквы отбрасываются. Следующий игрок выбирает из оставшихся букв. Проигрывает последний, кто не может сказать ни слова. Каждый играет оптимально.
Я цитирую здесь редакционную статью
To iterate over all non-empty subsets of the given
set when they represented using bitmasks:
submask = mask
while submask > 0
// do the job with the submask
submask = (submask - 1) AND mask
В одном из решений я видел
int solve(int state)
{
if(dp[state]!=-1)
return(dp[state]);
int res=1;
int nstate=state;
while(1)
{
if(valid[nstate])
res=solve(state&(~nstate));
if(res==0)
break;
nstate=((nstate-1)&state);
if(nstate==0)
break;
}
if(res==0)
dp[state]=1;
else
dp[state]=0;
return(dp[state]);
}
В этом коде есть еще один оператор AND с ~.
Я не могу понять, что такое «СОСТОЯНИЕ» здесь на самом деле, и как это И ведет нас через все состояния? Пожалуйста, объясните это.