看到第一眼就发觉是壮压DP

然后就三进制枚举子集吧。

这题真是壮压入门好题。。。

对于dp[i][j] 表示第i行,j状态下前i行的分配方案数。

那么dp[i][j]肯定是从i-1行转过来的

那么由于不能挨着放,那么我们肯定是枚举i - 1行状态时不能包含j的任何一位。

那么只要令k = ((1 << n) - 1) ^ j,k中肯定就不包含j的位了

是这样枚举k的子集

int sub = k;

do

{

sub = k& (sub - 1);

}while(sub != k);

然后对每个子集,判断合法性,然后相加即可。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#define MAXN 1005
#define INF 1000000000
using namespace std;
int dp[13][1 << 13];
int n, m;
int st[13];
int mod = 100000000;
bool ok(int s, int pos)
{
if((s | st[pos]) > st[pos]) return false;
for(int i = 0; i < n; i++)
if(s & (1 << i))
{
if(s & (1 << (i + 1))) return false;
}
return true;
}
int main()
{
int x;
scanf("%d%d", &m, &n);
for(int i = 1; i <= m; i++)
{
for(int j = 0; j < n; j++)
{
scanf("%d", &x);
if(x) st[i] |= (1 << j);
}
}
dp[0][0] = 1;
for(int i = 1; i <= m; i++)
{
for(int k = 0; k < (1 << n); k++)
{
int s = ((1 << n) - 1) ^ k;
if(ok(k, i))
{
//printf("%d %d\n", k, s);
dp[i][k] += dp[i - 1][0];
for(int j = s; j; j = s & (j - 1))
{
if(ok(j, i - 1))
dp[i][k] = (dp[i][k] + dp[i - 1][j]) % mod;
}
}
}
}
int ans = 0;
for(int i = 0; i < (1 << n); i++)
ans = (ans + dp[m][i]) % mod;
printf("%d\n", ans);
return 0;
}

[Usaco2006 Nov]Corn Fields牧场的安排 壮压DP的更多相关文章

  1. 【BZOJ1725】[Usaco2006 Nov]Corn Fields牧场的安排 状压DP

    [BZOJ1725][Usaco2006 Nov]Corn Fields牧场的安排 Description Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M< ...

  2. bzoj1725 [Usaco2006 Nov]Corn Fields牧场的安排(状压dp)

    1725: [Usaco2006 Nov]Corn Fields牧场的安排 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 714  Solved: 502 ...

  3. BZOJ1725】[Usaco2006 Nov]Corn Fields牧场的安排 状压DP

    Description Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M<=12; 1<=N<=12),每一格都是一块正方形的土地.FJ打算在牧 ...

  4. bzoj1725: [Usaco2006 Nov]Corn Fields牧场的安排(状压dfs)

    1725: [Usaco2006 Nov]Corn Fields牧场的安排 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1122  Solved: 80 ...

  5. 【bzoj1725】[USACO2006 Nov]Corn Fields牧场的安排 状态压缩dp

    题目描述 Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M<=12; 1<=N<=12),每一格都是一块正方形的土地.FJ打算在牧场上的某几格土 ...

  6. BZOJ 1725: [Usaco2006 Nov]Corn Fields牧场的安排 状压动归

    Description Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M<=12; 1<=N<=12),每一格都是一块正方形的土地.FJ打算在牧 ...

  7. BZOJ1725: [Usaco2006 Nov]Corn Fields牧场的安排

    1725: [Usaco2006 Nov]Corn Fields牧场的安排 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 400  Solved: 290 ...

  8. 【bzoj1725】[USACO2006 Nov]Corn Fields牧场的安排

    题目描述 Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M<=12; 1<=N<=12),每一格都是一块正方形的土地.FJ打算在牧场上的某几格土 ...

  9. BZOJ 1725: [Usaco2006 Nov]Corn Fields牧场的安排

    Description Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M<=12; 1<=N<=12),每一格都是一块正方形的土地.FJ打算在牧 ...

随机推荐

  1. 欧几里得旅行商问题 java与c++实现

    双调欧几里得旅行商问题是一个经典动态规划问题.<算法导论(第二版)>思考题15-1 旅行商问题描述:平面上n个点,确定一条连接各点的最短闭合旅程.这个解的一般形式为NP的(在多项式时间内可 ...

  2. 第 2 章 代理模式【Proxy Pattern】

    第 2 章 代理模式[Proxy Pattern] 以下内容出自:24种设计模式介绍与6大设计原则.pdf 什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道被代 ...

  3. Python还是很重要的,不能丢。学习IF和WHILE

    number = 23 guess = int(input('Enter an interger : ')) if guess == number: print('Congratulations, y ...

  4. JavaScript 将字符串转化为json对象

    var json = eval('(' + data + ')'); 其中data为字符串数据

  5. Sql中的datetime类型的空值和c#中的DateTime的空值的转换方法

    [一篮饭特稀原创,转载请注明出自http://www.cnblogs.com/wanghafan/p/3412796.html] 在NET 2.0以上版本提供了一种新的方法 就是加问号,DateTim ...

  6. CrystalDiskMark 的使用方法

    CrystalDiskMark 是一个测试你的硬盘或者存储设备的小巧硬盘测试工具.简单易于操作的界面让你随时可以测试你的存储设备,测试存储设备大小和测试数字都可以选择,还可测试可读和可写的速度. 具体 ...

  7. C++ Socket UDP "Hello World!"

    这是C++ SOCKET网络程序中的C/S结构之UDP "Hello World !",共两个控制台工程: //////////////////////////////////// ...

  8. Programming in lua 环境

    Lua 用一个名为environment 普通的表来保存所有的全局变量.(更精确的说,Lua在一系列的environment 中保存他的“global”变量,但是我们有时候可以忽略这种多样性)这种结果 ...

  9. Linux libtins 库安装教程

    因为工作原因需要用到libtins网络库, 所以今天去装一下. 很尴尬,由于本人对linux理解比较浅, 所以在中途遇到了一些问题. 虽然只是简单的安装步骤,但是阻挡不了自己菜啊. 一.  下载lib ...

  10. HDU1394-Minimum Inversion Number

    http://acm.hdu.edu.cn/showproblem.php?pid=1394 Minimum Inversion Number Time Limit: 2000/1000 MS (Ja ...