n的规模可以状压,f[x][y][S]表示x行,y列,S集合的巧克力能否被切割。
预处理出每个状态S对应的面积和sum(S),对于一个合法的状态一定满足x*y=sum(S),实际上只有两个变量是独立的。
而且有x,y等效与y,x,那么这里取max(x,y)。
转移的时候枚举S的非空真子集,横着切或者竖着切。
边间是到达一个合法的x,y,S,其中S中只有一个元素。
复杂度O(x*3^n)
#includeusing namespace std;const int Mx = 101,Mxs = 1<<16;bool meo[Mx][Mxs];int sumA[Mxs];int vis[Mx][Mxs], clk;//避免memsetint a[16],n;int ss[17];bool dfs(int x,int y,int S){ if(x >i&1) sumA[S] += a[i]; } } clk++; printf("Case %d: %s\n",clk,dfs(x,y,mxs-1)?"Yes":"No"); } return 0;}