LA 4794 Sharing Chocolate】的更多相关文章

大白书中的题感觉一般都比较难,能理解书上代码就已经很不错了 按照经验,一般数据较小的题目,都有可能是用状态压缩来解决的 题意:问一个面积为x×y的巧克力,能否切若干刀,将其切成n块面积为A1,A2,,,An块巧克力.(每次只能沿直线切一块巧克力) 设计状态: f(r, c, S) = 1表示r行c列的巧克力可以切成面积集合为S的若干块巧克力 分解问题: f(r, c, S) = 1当且仅当 横着切:存在1≤r0<r和S的子集S0,使得f(r0, c, S0) = f(r-r0,c, S-S0)…
题意 有一块\(x*y\)的巧克力,问能否恰好分成n块,每块个数如下 输入格式 n x y a1 a2 a3 ... an 首先\(x \times y 必然要等于 \sum\limits_{i=1}^{n}a_i\) 设集合状态为S,则转移方程为 \(f(x,y,S)=(f(x,c_0,S_0)\&\& f(x,y-c_0,S_1))\|(f(c_0,y,S_0)\&\& f(x-c_0,y,S_1)) \) 分别对应横着掰和竖着掰 由于 \(x \times y = \…
UVAlive 4794 Sharing Chocolate 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=12055 思路:   设d[S][r][c]表示形如r*c的矩形是否可以划分为S中的子集,10表示可否. 转移方程: d[S][r][c] = d[S0][r0][c] || d[S0][r][c0]  优化:    首先注意到S r c三者知二求一,所以将状态优化为d[S][x]表示有短边x的矩形是否可以…
Sharing Chocolate Chocolate in its many forms is enjoyed by millions of people around the world every day. It is a truly universal candy available in virtually every country around the world. You find that the only thing better than eating chocolate…
题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2795 题意 x * y的巧克力,问能不能恰好切成n份(只能整数切),每块大小恰好ai 思路 明显,记忆化搜索. 这里参照刘书使用了sum来通过长计算宽 感想: 这种需要枚举子状态的题总是不敢枚举 代码 #include <algorithm> #includ…
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) #include<bits/stdc++.h> using namespace std; ,Mxs = &l…
这道题目的DP思想挺先进的,用状态DP来表示各个子巧克力块.原本是要 dp(S,x,y),S代表状态,x,y为边长,由于y可以用面积/x表示出来,就压缩到了只有两个变量,在转移过程也是很巧妙,枚举S的子集s0,然后 s1=S-s0来代表除该子集的另一个集合,接下来分两种情况,如果这个子集是通过把 S保留x,切割y,则转移到dp(s0,x)和dp(s1,x),另一种情况是转移到dp(s0,y)和dp(s1,y).为了更加缩小状态,统一把转移方程的 x换成 min(x,sum[S]/x),sum为该…
状态压缩DP,把切割出的面积做状态压缩,统计出某状态下面积和. 设f(x,y,S)为在状态为S下在矩形x,y是否存在可能划分出S包含的面积.若S0是S的子集,对矩形x,y横切中竖切,对竖切若f(x,k,S0)且f(x,y-k,S^S0)为真,则为真,对横切同样. 然后枚举S的子集即可.可以用记忆化搜索. #include <iostream> #include <cstdio> #include <cstring> using namespace std; int dp…
题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3540 题目大意: 给一块长x,宽y的巧克力,和一个数组A={a1, a2, …,an},问能否经过若干次切分后,得到面积分别为a1,a2,…an的n块巧克力.每次切分只可以选择一块巧克力,将其分为两半,如下图,3×4的巧克力经过切分后,可以得到面积分别为6,3,2,1的巧克力.…
传送门 记忆化搜索. 在下觉得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; 若是只剩一块…