洛谷P2915 Usaco08 Mixed Up Cows
来源:互联网 发布:数据库冗余 编辑:程序博客网 时间:2024/05/16 13:41
标准的状压题!
所谓状态压缩就是将状态用二进制存储下来,并用位运算实现转移
用二进制存储,可以不重不漏地遍历到所有的状态
我们设0表示牛已在队伍中,1表示牛不在队伍中,最后需要求得全部为1的状态
设状态为f(i,j)表示第i头牛在队尾,队伍状态为j(一个二进制数)时的方案数
答案为
在讲到转移之前,有必要提一下位运算。将1左移N位,得到的二进制数其实是一个1后面带上N个0,这和我们需要的N个1不符
但是这个时候我们发现
而位运算的优先级又是很低的,所以代码里就需要写成i<=(1<<n)-1
转移过程则是先从小到大地枚举队伍状态i(一个二进制数),再不断地向队尾添加元素。
枚举队尾j,再枚举一个可以和队尾相接的元素p,就可以得到转移方程: f[p][i|(1<<p-1)] += f[j][i]
#include <algorithm>#include <iostream>#include <cstdio>using namespace std;#define debug(x) cerr << #x << "=" << x << endl;int a[20],n,k;long long f[20][1<<16],ans;int main() { cin >> n >> k; for(int i=1; i<=n; i++) cin >> a[i]; for(int i=1; i<=n; i++) f[i][1<<(i-1)] = 1; for(int i=1; i<=(1<<n)-1; i++) for(int j=1; j<=n; j++) if(i&(1<<j-1)) for(int p=1; p<=n; p++) if(!(i&(1<<p-1)) && abs(a[p]-a[j]) > k) //转移 f[p][i|(1<<p-1)] += f[j][i]; for(int i=1; i<=n; i++) ans += f[i][(1<<n)-1]; cout << ans << endl; return 0;}
阅读全文
0 0
- 洛谷P2915 Usaco08 Mixed Up Cows
- 洛谷 P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows
- 洛谷2915 usaco08nov 奶牛混合起来 Mixed Up Cows
- 【USACO 2008 Nov Gold】 1.Mixed Up Cows 状压DP、
- USACO 2008 Nov Gold 1.Mixed Up Cows
- bzoj1231[USACO 2008 Nov]Mixed Up Cows混乱的奶牛
- HNU ACM: Cheering up the Cows (kruscal)
- Cheering up the Cows,2008nov,usaco
- 题解:cheering up the cows[USACO2008 NOV]
- BZOJ1601 灌水(USACO08 Oct)
- Cows
- Cows
- php--mixed
- 【USACO 2008 Nov Gold】 2.Cheering up the Cows 最小生成树、
- up
- UP
- up
- up!
- Glide源码解析之山清水秀疑无路(一)
- 理解 LSTM 网络
- Portia可视化爬虫部署
- Intellij IDEA maven 不能建java文件
- 【DIY】实现一个缓存管理器
- 洛谷P2915 Usaco08 Mixed Up Cows
- JAVA_编程小案例_拆高位数字为多个个位数字
- Mongodb快速入门
- C语言:文件函数 fopen(),fclose(),fwrite(),fread()
- 大学生活记录2017.10.26
- Vue之通过http服务打开build后的项目
- 简单的js俄罗斯方块游戏源码
- java 对 汉字排序(按照拼音字母排序)
- 相机客观参数整理软件需求报告自动化统计