状态压缩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[105][(1<<15)+5];
bool vis[105][(1<<15)+5];
int area[105];
int se[1<<15]; int counts(int s){
int res=0;
while(s){
if(s&1) res++;
s>>=1;
}
return res;
} int dfs(int x,int st){
if(vis[x][st]) return dp[x][st];
int y=se[st]/x;
vis[x][st]=true;
if(counts(st)==1) return dp[x][st]=1;
for(int s0=(st-1)&st;s0;s0=(s0-1)&st){
if(se[s0]%x==0&&dfs(min(x,se[s0]/x),s0)&&dfs(min(x,se[s0^st]/x),s0^st))
return dp[x][st]=1;
if(se[s0]%y==0&&dfs(min(y,se[s0]/y),s0)&&dfs(min(y,se[s0^st]/y),s0^st))
return dp[x][st]=1;
}
return dp[x][st]=0;
} int main(){
int n,x,y,sum,icase=0;
while(scanf("%d",&n),n){
scanf("%d%d",&x,&y);
sum=0;
for(int i=0;i<n;i++){
scanf("%d",&area[i]);
sum+=area[i];
}
for(int i=0;i<(1<<n);i++){
se[i]=0;
for(int j=0;j<n;j++){
if((1<<j)&i) se[i]+=area[j];
}
}
memset(vis,false,sizeof(vis));
printf("Case %d: ",++icase);
if(sum!=x*y||sum%x!=0||sum%y!=0){
puts("No");
}
else{
dfs(min(x,y),(1<<n)-1);
if(dp[min(x,y)][(1<<n)-1]) puts("Yes");
else puts("No");
}
}
return 0;
}

  

LA 4794 状态DP+子集枚举的更多相关文章

  1. HDU6321 Dynamic Graph Matching【状压DP 子集枚举】

    HDU6321 Dynamic Graph Matching 题意: 给出\(N\)个点,一开始没有边,然后有\(M\)次操作,每次操作加一条无向边或者删一条已经存在的边,问每次操作后图中恰好匹配\( ...

  2. UVA11825 黑客的攻击 Hackers' Crackdown 状压DP,二进制,子集枚举

    题目链接Click Here [题目描述] 假如你是一个黑客,侵入了一个有着\(n\)台计算机(编号为\(1.2.3....n\))的网络.一共有\(n\)种服务,每台计算机都运行着所有服务.对于每台 ...

  3. BFS+状态压缩DP+二分枚举+TSP

    http://acm.hdu.edu.cn/showproblem.php?pid=3681 Prison Break Time Limit: 5000/2000 MS (Java/Others)   ...

  4. 1315E Double Elimination DP 01枚举状态和倍增思想

    E. Double Elimination DP 01枚举状态和倍增思想 题意 参考DOTA2双败赛制,一共有\(2^n\)个队打n轮 其中你有k喜欢的队伍,由你掌控比赛的输赢请问比赛中包含你喜欢的队 ...

  5. POJ 2411 压缩状态DP

    这个题目非常赞! 给定一个矩形,要求用1*2 的格子进行覆盖,有多少种覆盖方法呢? dp[i][j] 当状态为j,且第i行已经完全铺满的情况下的种类数有多少种?j中1表示占了,0表示没有被占. 很显然 ...

  6. UOJ #348 州区划分 —— 状压DP+子集卷积

    题目:http://uoj.ac/problem/348 一开始可以 3^n 子集DP,枚举一种状态的最后一个集合是什么来转移: 设 \( f[s] \) 表示 \( s \) 集合内的点都划分好了, ...

  7. POJ 1185 状态DP

    这个题目是个挺难表示的状态DP,因为不但要考虑上下还要考虑左右,在DP里面就没有什么下了咯,但也至少除了考虑左右还要考虑上 所以先枚举出在同一行满足条件的状态 即 某状态 若 s&(s< ...

  8. SPOJ 423 Assignments 状态DP

    这个题目搁置了这么久,终于搞完了. 给n个人分配n个课程,已经告诉了你n个人对哪几门感兴趣,问最多有多少种分配方式 我刚开始都没找到这怎么还可以状态dp,哪来的状态转移,想用暴力DFS,果断TLE的妥 ...

  9. hdu 4614 pieces 状态DP

    题意:给你一个长度小于等于16的字符串,每次可以删除一个回文传,问你最少删除干净的字数. 状态+dp dp[i] = min(dp[i],dp[j]+dp[j^i]);(j是i的字串): 连接:htt ...

随机推荐

  1. Python细节(一)深浅拷贝

    深浅拷贝 只要涉及拷贝,就会涉及创建新对象 浅拷贝,会创建一个新的容器,列表中的元素和原列表的元素用的是同一个内存空间 第一种方法:从头切到尾,完整的复制一份 lst = [1,2,3,4] lst1 ...

  2. vue打包问题:Tip: built files are meant to be served over an HTTP server.

    npm run build之后,出现提示:Tip: built files are meant to be served over an HTTP server. Opening index.html ...

  3. linux top 的用法

    本篇博文主要讲解有关top命令,top命令的主要功能是查看进程活动状态以及一些系统状况. TOP是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终 ...

  4. Tempter of the Bone------剪枝

    看了好多别人的  代码,最终还是 感觉 这种代码的风格适合我  下面附上代码 /* 首先 应该充满信心! 先写出来 自己的程序 然后慢慢改 , 如果是 答题思路错误的话 借鉴别人的 代码 再写 */ ...

  5. Prime Ring Problem -- 第一个真正意义上的 搜索

    这个搜索............搜的我头都大了.......不过还是 懂了那么一点点...哈哈 从3/7晚上  做到3/8晚上------从女生到妇女  我都用来做着一道题了......... 所谓的 ...

  6. 【洛谷2982】[Usaco2010 Feb]慢下来Slowdown(dfs序+线段树)

    题目: 洛谷2982 分析: 这道题最重要的是想明白一点:牛\(i\)走到以后只对\(P_i\)的子树产生影响 知道这个以后,就可以想到在线维护每个牧场已经被"影响"了多少次(也就 ...

  7. day03_12/13/2016_bean的管理之依赖注入

  8. unity3d 各键值对应代码

    KeyCode :KeyCode是由Event.keyCode返回的.这些直接映射到键盘上的物理键.  值        对应键 Backspace     退格键 Delete      Delet ...

  9. JS——undefined、null

    1.undefined == false   //返回false 2.null == false     //返回false 3.undefined == null    //返回true 4.und ...

  10. JS——绑定自定义属性

    1.绑定自定义属性: (1)元素节点.属性或元素节点[属性]绑定的属性不会出现在标签中,setAttribute可以出现在标签中. (2)setAttribute获取不到元素节点.属性形式绑定的属性值 ...