记忆化搜索。
在下觉得sxy大佬的代码写得相当好,通篇的骚操作(因为我都不会呀),%%% 学到了
预处理每个状态的值。以前的我都是zz地枚举每一位。。
for(int i=1;i<(1<<n);++i) {
x=(i&(-i));
if(i==x) continue;
tot[i]=tot[x]+tot[i^x];
}
f[r][s]==1表示搜索过且不合法,f[r][s]==2表示搜索过且合法
if
(f[r][s])
return
f[r][s]-1;
若是只剩一块巧克力要分
if
(s==(s&(-s)))
return
f[r][s]=2,1;
枚举子集,y为x在s下的补集
for
(x=(s-1)&s;x;x=(x-1)&s) {
y=s-x;
}
两维状态值相加或相乘为定值时,用一维来代替也是一个常见的套路。