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& ...
随机推荐
- eclipse 自动 注释
在使用Eclipse 编写Java代码时,自动生成的注释信息都是按照预先设置好的格式生成的. 修改作者.日期注释格式:打开Windows->Preferences->Java->Co ...
- 使用Assetbundle时可能遇到的坑
原地址:http://www.cnblogs.com/realtimepixels/p/3652128.html 一 24 十一郎未分类 No Comments 转自 http://www.unity ...
- sparksql链接mysql
1.在IDEA上建立一个sparksql_mysql的scala对象. 2.连接mysql的代码如下 import java.sql.{DriverManager, PreparedStatement ...
- JDBC资料集
1.基本的JDBC概念: http://dev.mysql.com/doc/refman/5.1/zh/connectors.html#cj-basic-jdbc 2.JSP&Servlet学 ...
- ExtJs之DHTML,DOM,EXTJS的事件绑定区别
<!DOCTYPE html> <html> <head> <title>ExtJs</title> <meta http-equiv ...
- hdu 4559 涂色游戏(对SG函数的深入理解,推导打SG表)
提议分析: 1 <= N <= 4747 很明显应该不会有规律的,打表发现真没有 按题意应该分成两种情况考虑,然后求其异或(SG函数性质) (1)找出单独的一个(一列中只有一个) (2)找 ...
- Linux command: usermod -- 改变用户状态
应用举例: 1. usermod -g newuser newuser force use GROUP as new primary group. 一般时候是默认的,也是必须的(不能更改).2. 指定 ...
- SPRING IN ACTION 第4版笔记-第十章Hitting the database with spring and jdbc-001-Spring对原始JDBC的封装
1.spring扩展的jdbc异常 2.Template的运行机制 Spring separates the fixed and variable parts of the data-access p ...
- C 语言文件操作
C 语言文件操作 1. 数据流: 程序与数据的交互以流的形式进行.fopen 即打开数据流,fclose 即刷新数据流. 所谓数据流,是一种抽象,表示这段数据像流一样,需要逐步接收,不 ...
- http://blog.csdn.net/xiamizy/article/details/40781939
http://blog.csdn.net/xiamizy/article/details/40781939