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的矩形是否可以分为S的子集,长边==sum(S)/x ,这样恰好迎合了另外一个优化——只计算r*c==S的状态。

代码:

 #include<iostream>
#include<cstring>
using namespace std; const int maxn = +;
const int maxw = + ; int d[<<maxn][maxw],vis[<<maxn][maxw];
int sum[<<maxn];
int kase=; inline int bitcount(int x) { return x==?:bitcount(x/)+(x&); } int dp(int s,int x) {
if(vis[s][x]==kase) return d[s][x]; //记忆化搜索
vis[s][x]=kase;
if(bitcount(s)==) return d[s][x]=; //搜索边界 int& ans=d[s][x];
int y=sum[s]/x; //根据s与x计算y
for(int s0=(s-)&s;s0;s0=(s0-)&s) { //枚举子集 //一刀
int s1=s-s0; //划分成两个子集
if(sum[s0]%x== && dp(s0,min(x,sum[s0]/x)) && dp(s1,min(x,sum[s1]/x)) ) return ans=; //是纵向一刀
if(sum[s0]%y== && dp(s0,min(y,sum[s0]/y)) && dp(s1,min(y,sum[s1]/y)) ) return ans=; //抑或横向一刀
//如果有一种切法 分成的两个子矩形YES的话那么该矩阵为YES
} return ans=;
} int main() {
ios::sync_with_stdio(false);
int n,x,y;
int A[maxn];
memset(vis,,sizeof(vis)); while(cin>>n && n) {
cin>>x>>y;
for(int i=;i<n;i++) cin>>A[i]; int full=(<<n)-;
for(int s=;s<=full;s++){ //离线计算集合s之和
sum[s]=;
for(int j=;j<n;j++) if(s&(<<j)) sum[s] += A[j];
} int ans;
if(sum[full]!=x*y || sum[full]%x!=) ans=; //面积相等且形如x*y
else
ans=dp(full,min(x,y)); cout<<"Case "<<++kase<<": ";
cout<<(ans? "YES" : "No")<<"\n";
}
return ;
}

【暑假】[深入动态规划]UVAlive 4794 Sharing Chocolate的更多相关文章

  1. UVALive 4794 Sharing Chocolate

    Sharing Chocolate Chocolate in its many forms is enjoyed by millions of people around the world ever ...

  2. UVALive 4794 Sharing Chocolate(状压,枚举子集)

    n的规模可以状压,f[x][y][S]表示x行,y列,S集合的巧克力能否被切割. 预处理出每个状态S对应的面积和sum(S),对于一个合法的状态一定满足x*y=sum(S),实际上只有两个变量是独立的 ...

  3. UVALive 4794 Sharing Chocolate DP

    这道题目的DP思想挺先进的,用状态DP来表示各个子巧克力块.原本是要 dp(S,x,y),S代表状态,x,y为边长,由于y可以用面积/x表示出来,就压缩到了只有两个变量,在转移过程也是很巧妙,枚举S的 ...

  4. LA 4794 Sharing Chocolate

    大白书中的题感觉一般都比较难,能理解书上代码就已经很不错了 按照经验,一般数据较小的题目,都有可能是用状态压缩来解决的 题意:问一个面积为x×y的巧克力,能否切若干刀,将其切成n块面积为A1,A2,, ...

  5. LA 4794 - Sharing Chocolate dp

    题意 有一块\(x*y\)的巧克力,问能否恰好分成n块,每块个数如下 输入格式 n x y a1 a2 a3 ... an 首先\(x \times y 必然要等于 \sum\limits_{i=1} ...

  6. UVa Live 4794 - Sharing Chocolate 枚举子集substa = (s - 1) & substa,记忆化搜索 难度: 2

    题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...

  7. 【暑假】[深入动态规划]UVAlive 3983 Robotruck

     UVAlive 3983 Robotruck 题目: Robotruck   Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format ...

  8. 2015暑假训练(UVALive 5983 - 5992)线段树离线处理+dp

    A: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=83690#problem/A 题意:N*M的格子,从左上走到右下,要求在每个点的权值 ...

  9. UVa 1009 Sharing Chocolate (数位dp)

    题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_proble ...

随机推荐

  1. mysql分表与分区表

    mysql分表与分区表 转自:http://blog.51yip.com/mysql/949.html   一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具 ...

  2. linux上很方便的上传下载文件工具rz和sz

    linux上很方便的上传下载文件工具rz和sz(本文适合linux入门的朋友) ##########################################################&l ...

  3. 现在不使用ZeroClipboard我们也能实现复制功能(转)

    现在不使用ZeroClipboard我们也能实现 首先,我们保证页面结构不变,但不在引入ZeroClipboard插件: 1 <input type="text" name= ...

  4. 在js中获取easyui datagrid的数据

    可以在页面对datagrid的数据直接进行修改,然后提交到数据库,但是要求在提交前获取datagrid的所有行的数据.API提供了getData方法,但是怎么用了,没说. 最后这样写才搞定 var a ...

  5. uva 624

    背包问题  总时间为容量,单个唱片时间为各个物体的价值与体积   f[] 用来记录路径 #include <cstdio> #include <cstring> #define ...

  6. POJ 1220 NUMBER BASE CONVERSION(较复杂的进制转换)

    题目链接 题意 : 给你一个a进制的数串s,让你转化成b进制的输出. A = 10, B = 11, ..., Z = 35, a = 36, b = 37, ..., z = 61,0到9还是原来的 ...

  7. eclipse安装Log4E插件以及简单使用

    一. Log4E插件下载 下载地址:http://log4e.jayefem.de/content/view/3/2/ 二.安装Log4E插件 将下载下来的压缩包解压缩,如下图所示: 解压缩生成的[d ...

  8. [itint5]任务调度

    http://www.itint5.com/oj/#10 拓扑排序.首先按照题目给出的数据结构复杂度不会是O(v+e)的,所以先要变换数据结构.二来写的时候用一个stack会更好点.还有就是题目里其实 ...

  9. Linux如何在虚拟机中挂载iso yum源

    首先,将作为源的iso的挂载到系统上. 代码如下: mount -o loop /dev/cdrom /mnt/iso/ 或者 mount -o loop /xxx/xxx.iso /mnt/iso/ ...

  10. Silverlight之Styles和Behaviors

    本文简介 1.定义简单的Style 2.应用Style到元素 3.动态加载Style资源文件 4.Style的继承 5.组织内编写Style(在元素内) 6.自动应用Style到指定类型元素 7.St ...