UVALive 4794 Sharing Chocolate(状压,枚举子集)
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;
- const int Mx = ,Mxs = <<;
- bool meo[Mx][Mxs];
- int sumA[Mxs];
- int vis[Mx][Mxs], clk;//避免memset
- int a[],n;
- int ss[];
- bool dfs(int x,int y,int S)
- {
- if(x<y) swap(x,y);
- if(vis[x][S] == clk) return meo[x][S];
- vis[x][S] = clk;
- if(sumA[S] != x*y) return meo[x][S] = false;//这里其实可以dfs外就判断,之后转移一定保证合法
- if(*lower_bound(ss,ss+,S)== S) return meo[x][S] = true;
- for(int S0 = S&(S-); S0 ; S0 = (S0-)&S){//忽略不在S中的1
- if(sumA[S0]%x == ){
- int y0 = sumA[S0]/x;
- if(dfs(x,y0,S0) && dfs(x,y-y0,S^S0)) return meo[x][S] = true;
- }
- if(sumA[S0]%y == ){
- int x0 = sumA[S0]/y;
- if(dfs(x0,y,S0) && dfs(x-x0,y,S^S0)) return meo[x][S] = true;
- }
- }
- return meo[x][S] = false;
- }
- //#define LOCAL
- int main()
- {
- #ifdef LOCAL
- freopen("in.txt","r",stdin);
- #endif
- for(int i = ; i < ; i++){
- ss[i] = <<i;
- }
- while(scanf("%d",&n),n){
- int x,y; scanf("%d%d",&x,&y);
- for(int i = ; i < n; i++) scanf("%d",a+i);
- int mxs = (<<n);
- for(int S = ; S < mxs; S++){
- sumA[S] = ;
- for(int i = ; i < n; i++){
- if(S>>i&) sumA[S] += a[i];
- }
- }
- clk++;
- printf("Case %d: %s\n",clk,dfs(x,y,mxs-)?"Yes":"No");
- }
- return ;
- }
UVALive 4794 Sharing Chocolate(状压,枚举子集)的更多相关文章
- 【暑假】[深入动态规划]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 ...
- UVALive 4794 Sharing Chocolate DP
这道题目的DP思想挺先进的,用状态DP来表示各个子巧克力块.原本是要 dp(S,x,y),S代表状态,x,y为边长,由于y可以用面积/x表示出来,就压缩到了只有两个变量,在转移过程也是很巧妙,枚举S的 ...
- CF1556F Sports Betting (状压枚举子集DP)
F 对于一张比赛图,经过缩点,会得到dag,且它一定是transitive的,因此我们能直接把比赛图缩成一个有向链.链头作为一个强连通分量,里面的所有点都是胜利的 定义F(win)表示win集合作为赢 ...
- [POJ1681]Painter's Problem(高斯消元,异或方程组,状压枚举)
题目链接:http://poj.org/problem?id=1681 题意:还是翻格子的题,但是这里有可能出现自由变元,这时候枚举一下就行..(其实这题直接状压枚举就行) /* ━━━━━┒ギリギリ ...
- HDU2489【状压枚举】
题意: 给你n个点的图,然后让你在图里挑m个点,达到sumedge/sumnode最小 思路: 由于数据范围小,状压枚举符合m个点的状态,我是用vactor存了结点位置,也记录了结点的sum值,然后跑 ...
- POJ3734【状压枚举】
题意: 给你两个01矩阵,去掉矩阵B的某些行和某些列,问处理后的矩阵B能否变成矩阵A: 思路: 数据较小,状压枚举B矩阵列的数量=A矩阵列的数量时的状态,然后搞定了列,贪心判断B矩阵的行就好了: #i ...
- HDU6321 Dynamic Graph Matching【状压DP 子集枚举】
HDU6321 Dynamic Graph Matching 题意: 给出\(N\)个点,一开始没有边,然后有\(M\)次操作,每次操作加一条无向边或者删一条已经存在的边,问每次操作后图中恰好匹配\( ...
- UVaLive 6625 Diagrams & Tableaux (状压DP 或者 DFS暴力)
题意:给一个的格子图,有 n 行单元格,每行有a[i]个格子,要求往格子中填1~m的数字,要求每个数字大于等于左边的数字,大于上边的数字,问有多少种填充方法. 析:感觉像个DP,但是不会啊...就想暴 ...
随机推荐
- XXX.h:143: error: expected declaration specifiers or ‘...’ before ‘YYY’
出现上面头文件错误,原因是定义YYY的头和XXX.h互相包含了
- windows64位如何安装pyspider并运行
1.下载whl文件: http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml 2.安装该文件 3.可能碰到问题,pip的版本低了,需要更新一下pip的版本.更新 ...
- PHP正则表达式,看这一篇就够啦!
前言 不知道你们有没有这个感觉,看正则表达式就像看天文数字一样,什么电话号码.邮箱的正则表达式,上网复制一下粘贴下来就搞定了.完全不知道这写的是什么玩意.后来我自己也想学一下,因为感觉用处还是挺大的. ...
- poj3164(最小树形图&朱刘算法模板)
题目链接:http://poj.org/problem?id=3164 题意:第一行为n, m,接下来n行为n个点的二维坐标, 再接下来m行每行输入两个数u, v,表点u到点v是单向可达的,求这个有向 ...
- 截取HTML中的JSON数据并利用GSON进行解析(Android)
截取HTML中的JSON数据并利用GSON进行解析(Android) 前言 最近在做的一个Android项目,需要自行搭建服务器,队友选择买了阿里云的服务器ESC产品,在数据获取上,我们采用了Andr ...
- ES6简述
啥是ES6 大家都知道,JavaScript由DOM.BOM.ECMAScript组成,ECMAScript是标准. ES6的全称其实是ES2015(6.0)每年更新,依次类推 ES2016(7) . ...
- Vue中如何将数据传递到下一个页面(超级简单哒)
先展示效果:注意URL中值是有变化的 一:在goodslist.vue文件夹绑定 <router-link :to="'/goodsinfo/'+subitem.artID" ...
- ssrf漏洞分析
ssrf漏洞分析 关于ssrf 首先简单的说一下我理解的ssrf,大概就是服务器会响应用户的url请求,但是没有做好过滤和限制,导致可以攻击内网. ssrf常见漏洞代码 首先有三个常见的容易造成ssr ...
- 关于EasyML的使用
一.安装IntelliJ Idea 具体安装过程比较简单.但是遇到一个问题,如今LInux版本的IntelliJ的安装需要jdk1.8及以上版本的支持,但是EasyML目前仅支持jdk1.7的环境. ...
- springcloud-Netflix创建服务消费者
目录 springcloud-Netflix创建服务消费者 Ribbon 创建服务消费者-Ribbon方式 ribbon的架构 Feign 创建包和基本项目结构 创建Feign访问服务的接口和访问co ...