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) = 1. 或者
- 竖着切:存在1≤C0<C和S的子集S0,使得f(r, C0, S0) = f(r,C-C0, S-S0) = 1.
状态的优化:
因为f(r, c, S) = f(c, r, S),所以我们去掉一个参数,并且假设r≤c
记f(r, S)表示min(r, sum[S]/r)行max(r, sum[S]/r)列的巧克力能否切成面积和为sum[S]的若干块
DP函数中那句 int& ans;的作用是什么作用不太懂,我开始时去掉以后WA掉了,Orz
这句留着以后再弄懂吧,=_=||
将ans声明为f[S][x]的引用,这样ans在赋值的时候f[S][x]也相应被改变
//#define LOCAL
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; const int maxn = ;
const int maxw = + ;
int a[maxn], sum[ << maxn], f[ << maxn][maxw], vis[ << maxn][maxw]; int bitcount(int S)
{
return S == ? : (S & ) + bitcount(S >> );
} int dp(int S, int x)
{
if(vis[S][x]) return f[S][x];
vis[S][x] = ;
int& ans = f[S][x];
if(bitcount(S) == )
return ans = ;
int y = sum[S] / x;
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 = ;
}
return ans = ;
} int main(void)
{
#ifdef LOCAL
freopen("4794in.txt", "r", stdin);
#endif int kase = , n;
while(scanf("%d", &n) == && n)
{
int x, y;
scanf("%d%d", &x, &y);
for(int i = ; i < n; ++i)
scanf("%d", &a[i]); memset(sum, , sizeof(sum));
for(int i = ; i < ( << n); ++i)
for(int j = ; j < n; ++j)
if(i & ( << j))
sum[i] += a[j]; memset(vis, , sizeof(vis));
int All = ( << n) - ;
int ans;
if(sum[All] != x*y)
ans = ;
else
ans = dp(All, min(x, y));
printf("Case %d: %s\n", ++kase, ans ? "Yes" : "No");
}
return ;
}
代码君
LA 4794 Sharing Chocolate的更多相关文章
- LA 4794 - Sharing Chocolate dp
题意 有一块\(x*y\)的巧克力,问能否恰好分成n块,每块个数如下 输入格式 n x y a1 a2 a3 ... an 首先\(x \times y 必然要等于 \sum\limits_{i=1} ...
- 【暑假】[深入动态规划]UVAlive 4794 Sharing Chocolate
UVAlive 4794 Sharing Chocolate 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=12055 ...
- UVALive 4794 Sharing Chocolate
Sharing Chocolate Chocolate in its many forms is enjoyed by millions of people around the world ever ...
- 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 ...
- UVALive 4794 Sharing Chocolate(状压,枚举子集)
n的规模可以状压,f[x][y][S]表示x行,y列,S集合的巧克力能否被切割. 预处理出每个状态S对应的面积和sum(S),对于一个合法的状态一定满足x*y=sum(S),实际上只有两个变量是独立的 ...
- UVALive 4794 Sharing Chocolate DP
这道题目的DP思想挺先进的,用状态DP来表示各个子巧克力块.原本是要 dp(S,x,y),S代表状态,x,y为边长,由于y可以用面积/x表示出来,就压缩到了只有两个变量,在转移过程也是很巧妙,枚举S的 ...
- LA 4794 状态DP+子集枚举
状态压缩DP,把切割出的面积做状态压缩,统计出某状态下面积和. 设f(x,y,S)为在状态为S下在矩形x,y是否存在可能划分出S包含的面积.若S0是S的子集,对矩形x,y横切中竖切,对竖切若f(x,k ...
- UVa 1009 Sharing Chocolate (数位dp)
题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_proble ...
- LA4794 Sharing Chocolate
传送门 记忆化搜索. 在下觉得sxy大佬的代码写得相当好,通篇的骚操作(因为我都不会呀),%%% 学到了 预处理每个状态的值.以前的我都是zz地枚举每一位.. for(int i=1;i<(1& ...
随机推荐
- Ambient Occlusion
一般在光照模型中,ambient light的计算方法为:A = l * m,其中l表示表面接收到的来自光源的ambient light的总量,而m表示表面接收到ambient light后,反射和吸 ...
- Razor之代码复用
原文:http://www.cnblogs.com/youring2/archive/2011/07/26/2115493.html 1.布局(Layout)复用 Layout的使用,就像WebFor ...
- 【译】使用 Python 编写虚拟机解释器
[译]如何使用 Python 创建一个虚拟机解释器? 原文地址:Making a simple VM interpreter in Python 更新:根据大家的评论我对代码做了轻微的改动.感谢 ro ...
- iOS导航栏-导航栏透明
设置一张透明图片:nav_bargound.png //导航栏背景 [self.navigationController.navigationBar setBackgroundImage:[ ...
- line-height 与垂直居中!
在此之前,对于line-height 与垂直居中的问题,经常碰到. 比如,图片与span在同一个box中的时候,竟然会各种偏移.要想达到理想的效果真的是各种难. 有时间,决定认真的啃一啃. 一 lin ...
- ios开发之AppDelegate
创建应用程序之后之后,默认有AppDelegate.h文件与AppDelegate.m文件. AppDelegate为何物? AppDelegate为整个应用的一个代理,提供程序启动.退出等类似 ...
- Win32应用程序中文支持
Settings--Editor---Encoding改为Windows 936 main.cpp中#include "locale.h" winmain中增加一行: setloc ...
- 2014多校第七场1003 || HDU 4937 Lucky Number
题目链接 题意 : 给定一个十进制n,让你转化成某个进制的数,让这个数只包含3 4 5 6这些数字,这个进制就成为n的幸运数字,输出有多少幸运数字,例如19,5进制表示是34,所以5是19的一个幸运数 ...
- WEB前端介绍
1.WEB前端是神马 Web前端开发是从网页制作演变而来的,名称上有很明显的时代特征.在互联网的演化进程中,网页制作是Web1.0时代的产物,那时网站的主要内容都是静态的,用户使用网站的行为也以浏览为 ...
- 【原创】通俗易懂地解决中文乱码问题(2) --- 分析解决Mysql插入移动端表情符报错 ‘incorrect string value: '\xF0...
这篇blog重点在解决问题,如果你对字符编码并不是特别了解,建议先看看 < [原创]通俗易懂地解决中文乱码问题(1) --- 跨平台乱码 >. 当然,如果只是针对解决这个Mysql插入报错 ...