UVA 1099 Sharing Chocolate - 状压dp
2016-03-20 11:54
417 查看
题目描述
问:是否可以经过若干次操作得到n块面积分别为a1, a2, …, an的巧克力。
用sum[s]表示状态s中面积和,一定有:x*y=sum[s],
优化状态表示:dp[s][r]。
因为dp[s][x][y]=dp[s][y][x],规定dp[s][r]中的r<=sum[s]/r。
转移的时候,不是枚举横切、竖切的位置,而是枚举子集s0,如果sum[s0]%r==0(竖切)或者sum[s0]%c==0(横切),则进行转移。
题目大意:
给出一块长为x,宽为y的矩形巧克力,每次操作可以沿着一条直线把一块巧克力切割成两块长宽均为整数的巧克力,一次只能切一块巧克力。问:是否可以经过若干次操作得到n块面积分别为a1, a2, …, an的巧克力。
分析:
容易想到dp[s][x][y]的转移,但是时间空间的hold不住。用sum[s]表示状态s中面积和,一定有:x*y=sum[s],
优化状态表示:dp[s][r]。
因为dp[s][x][y]=dp[s][y][x],规定dp[s][r]中的r<=sum[s]/r。
转移的时候,不是枚举横切、竖切的位置,而是枚举子集s0,如果sum[s0]%r==0(竖切)或者sum[s0]%c==0(横切),则进行转移。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define MAXN 15 #define MAXST 32768 #define MAXR 100 int n,l,w,a[MAXN+10],sum[MAXST+10],S,dp[MAXR+10][MAXST+10]; bool check[MAXST+10]; void Init() { memset(sum,0,sizeof sum); memset(check,0,sizeof check); } void read() { scanf("%d%d",&l,&w); for(int i=0;i<n;i++) scanf("%d",&a[i]); S=(1<<n)-1; for(int s=0;s<=S;s++){ for(int i=0;i<n;i++) if(s&(1<<i)) sum[s]+=a[i]; } for(int i=0;i<n;i++) check[1<<i]=true; } int DP(int r,int s) { if(dp[r][s]!=-1) return dp[r][s]; if(check[s]) return dp[r][s]=1; dp[r][s]=0; int c=sum[s]/r; for(int s0=1;s0<s;s0++){ if((s0&s)!=s0) continue; if(sum[s0]%r==0){ if(DP(min(r,sum[s0]/r),s0)==1&&DP(min(r,sum[s^s0]/r),s^s0)==1) dp[r][s]=1; } if(sum[s0]%c==0){ if(DP(min(c,sum[s0]/c),s0)==1&&DP(min(c,sum[s^s0]/c),s^s0)==1) dp[r][s]=1; } } return dp[r][s]; } int main() { int cas=0; while(scanf("%d",&n)&&n){ Init(); read(); memset(dp,-1,sizeof dp); if(sum[S]==l*w&&DP(l,S)==1) printf("Case %d: Yes\n",++cas); else printf("Case %d: No\n",++cas); } }
相关文章推荐
- Nginx handler 返回值解释
- 解决android studio错误 --> Error:(1, 0) Plugin with id 'com.android.application' not found
- Kafka学习之五 Kafka架构以及设计原理
- 新手学习PHP的经典算法(1):分苹果
- Android Canvas save() restore()
- 深入理解CSS元素可见性visibility
- 单片机传递浮点数方法
- redis安装,简单测试,简单使用命令,设置密码
- Hadoop-2.6.0 + Zookeeper-3.4.6 + HBase-0.98.9-hadoop2环境搭建示例
- 几年一博文
- iOS开发之多线程 GCD
- LINQ to XML 编程基础
- HDU 5646 DZY Loves Partition 数列
- jmeter测试FTP服务器性能和FTP服务器搭建
- 2. hdfs
- failed to find target with hash string 'android-22'导入adt工程,编译时遇到这个报错。
- C语言之冒泡排序算法
- ExtJs之Ext.form.field.TimePicker DatePicker组合框
- 多线程“基础篇”02之 常用的实现多线程的两种方式
- 动画demo