HDU 4277 USACO ORZ [状态压缩+枚举]
2012-09-10 23:43
459 查看
很黄很暴力的枚举,加上了状态压缩的优化。
用15位的状态压缩木棍,1代表使用,0代表没有使用。然后枚举1~2^15作为一根木棍的组成,取反后的状态为令两根木棍,再枚举这个状态的所有子集,即将它拆成两根木棍。。。然后HASH一下就可以了。
其实是有重复状态的,每种状态都会重复六次。加上一个优化if(len[i]>=len[ii])continue;当第一条边比剩余两条边的和都大的时候就不去枚举剩余两条边的组合,这样效率会高上很多。
用15位的状态压缩木棍,1代表使用,0代表没有使用。然后枚举1~2^15作为一根木棍的组成,取反后的状态为令两根木棍,再枚举这个状态的所有子集,即将它拆成两根木棍。。。然后HASH一下就可以了。
其实是有重复状态的,每种状态都会重复六次。加上一个优化if(len[i]>=len[ii])continue;当第一条边比剩余两条边的和都大的时候就不去枚举剩余两条边的组合,这样效率会高上很多。
#include <stdio.h> #include <string.h> #include <algorithm> #include <set> #define MOD 100007 #define MAXD 10000010 int cas,n,x,len[1<<15],hash; int first[MOD],next[MAXD],es; int numa[MAXD],numb[MAXD],size; void ins(int x,int y,int p){ numa[es]=x,numb[es]=y,next[es]=first[p],first[p]=es++; } bool findhash(int x,int y){ int p=(x*10000+y)%MOD; for(int i=first[p];i!=-1;i=next[i])if(numa[i]==x&&numb[i]==y)return 1; return 0; } void inshash(int x,int y){ if(!findhash(x,y)){ size++;//哈希表的大小 int p=(x*10000+y)%MOD; ins(x,y,p); } } int main(){ //freopen("test.in","r",stdin); for(scanf("%d",&cas);cas--;){ scanf("%d",&n); memset(first,-1,sizeof first);es=size=0; int full=1<<n,ans=0; memset(len,0,sizeof len); for(int i=0;i<n;i++)scanf("%d",&len[1<<i]); for(int i=0;i<full;i++)len[i]=len[(i-1)&i]+len[i&-i]; for(int i=1;i<full;i++){ int ii=~i&(full-1); //剪枝,如果第一条边大于后两条边之和就不用加了 if(len[i]>=len[ii])continue; for(int j=(ii-1)ⅈj;j=(j-1)&ii){ int k=ii-j; if(len[i]>=len[j]&&len[j]>=len[k])inshash(len[i],len[j]); } } printf("%d\n",size); } return 0; }
相关文章推荐
- hdu 4033 状态压缩枚举
- HDU-4462(状态压缩,枚举)
- HDU-4462 Scaring the Birds 状态压缩枚举
- hdu 4628 Pieces (状态压缩+二进制枚举+dp)
- HDU 4462 Scaring the Birds(状态压缩枚举)
- hdu 2489 最小生成树状态压缩枚举
- HDU 4277 USACO ORZ(暴力+双向枚举)
- HDU 5339 Untitled (状态压缩枚举)
- HDU 4277 USACO ORZ(暴力+双向枚举)
- HDU 4770 Lights Against Dudely 【状态压缩+暴力枚举】
- HDU 4403 A very hard Aoshu problem (状态压缩+枚举)
- HDU 4309 Seikimatsu Occult Tonneru(最大流SAP+状态压缩枚举)
- hdu 4033 状态压缩枚举
- HDU 1565 方格取数(1)(插头DP||状态压缩)
- HDU 1429胜利大逃亡(续) (bfs+状态压缩)
- [ACM] HDU 1400 Mondriaan's Dream (状态压缩,长2宽1长方形铺满)
- hdu 4539 状态压缩DP
- hdu1074 Doing Homework (状态压缩dp)
- hdu 4539 郑厂长系列故事——排兵布阵(状态压缩dp)
- HDU 5135 Little Zu Chongzhi's Triangles(状态压缩dp+Vector)