LA4794 Sharing Chocolate

传送门

记忆化搜索。

在下觉得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;
}

 

两维状态值相加或相乘为定值时,用一维来代替也是一个常见的套路。

 

posted @ 2017-09-29 20:42  啊宸  阅读(205)  评论(0编辑  收藏  举报