题目:

链接

思路:

Q:如何想到是状压DP

A:那是因为(我看了标签)\(1 ≤ M ≤ 12; 1 ≤ N ≤ 12\),\(2 ^ {12}\) 不过才。。。(Win7计算器使用中)\(4096\)嘛! 然后如果用状压DP也可以优化时空


确定状态:

\(f_{i,j}\) 表示第\(i\)行的方案(对,方案,这是方案而答案是方案数)是\(j\)(是一个二进制数,用十进制来存储,第\(k\)位是\(1/0\)(二进制)表示选\(/\)不选)时的方案数。

确定转移方程:

声明:下面的\(j,k\)都是一个合法的方案

设已经进行到\(i\)行,此时的方案是\(j\),上一行的方案是\(k\)。

有一个特殊条件(边界):\(i = 1\)。

既然是第一行,那么它的所以合法方案都是正确的,所以边界是:

\[\Large {f_{1,j} = 1}
\]

也可以很容易地想到本行的合法方案的方案数是上一行的所有合法方案数,也就是:

\[\Large {f_{i,j} = f_{i,j}+f_{i - 1,k}}
\]

代码:

声明:那个优化可能并无卵用。。。

const int N = 15;
int n, m;
int f[N][(1 << N)];
int st[1 << N]; //一个小小的优化数组
int a[N];
int tot; void _init() //一个小小的优化,判断此方案 在这一行 是不是合法的
{
for (int i = 0; i < (1 << m); i++)
{
if (i & (i << 1)) continue;
st[++tot] = i;
}
} int main()
{
scanf ("%d%d", &n, &m);
for (int j = 1; j <= n; j++)
for (int i = m - 1; i >= 0; i--)
{
int x;
scanf ("%d",&x);
a[j] += (x << i); //本行的方案(可能不是合法)
}
_init(); //开始优化
for (int i = 1; i <= tot; i++) //边界条件
{
if (!((st[i] | a[1]) == a[1]))continue; //是否合法
f[1][st[i]] = 1;
}
for (int i = 2; i <= n; i++)
{
for (int j = 1; j <= tot; j++)
{
if (!((st[j] | a[i]) == a[i]))continue; //判断合法
for (int k = 1; k <= tot; k++)
{
if (!((st[k] | a[i - 1]) == a[i - 1]))continue; //同上条注释
if (st[j] & st[k]) continue;
f[i][st[j]] += f[i - 1][st[k]]; //转移
f[i][st[j]] %= 100000000;
}
}
}
int ans = 0;
for (int j = 1; j <= tot; j++) //答案
ans += f[n][st[j]], ans %= 100000000;
printf ("%d", ans);
return 0;
}

【洛谷 P1879】【[USACO06NOV]玉米田Corn Fields】的更多相关文章

  1. 洛谷P1879 [USACO06NOV]玉米田Corn Fields(状压dp)

    洛谷P1879 [USACO06NOV]玉米田Corn Fields \(f[i][j]\) 表示前 \(i\) 行且第 \(i\) 行状态为 \(j\) 的方案总数.\(j\) 的大小为 \(0 \ ...

  2. C++ 洛谷 P1879 [USACO06NOV]玉米田Corn Fields

    没学状压DP的看一下 合法布阵问题  P1879 [USACO06NOV]玉米田Corn Fields 题意:给出一个n行m列的草地(n,m<=12),1表示肥沃,0表示贫瘠,现在要把一些牛放在 ...

  3. 洛谷 P1879 [USACO06NOV]玉米田Corn Fields 题解

    P1879 [USACO06NOV]玉米田Corn Fields 题目描述 Farmer John has purchased a lush new rectangular pasture compo ...

  4. 洛谷P1879 [USACO06NOV]玉米田Corn Fields (状态压缩DP)

    题目描述 Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ...

  5. 洛谷P1879 [USACO06NOV]玉米田Corn Fields【状压DP】题解+AC代码

    题目描述 Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ...

  6. 洛谷 P1879 [USACO06NOV]玉米田Corn Fields

    题目描述 Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ...

  7. [洛谷P1879][USACO06NOV]玉米田Corn Fields

    题目大意:有一个$n\times m$的矩阵,$(1 \leq m \leq 12; 1 \leq n \leq 12)$,想在其中的一些格子中种草,一些格子不能种草,且两块草地不相邻.问有多少种种植 ...

  8. 【洛谷P1879】玉米田Corn Fields

    玉米田Corn Fields 题目链接 此题和互不侵犯状压DP的做法类似 f[i][j]表示前i行,第i行种植(1)/不种植(0)构成的二进制数为j时的方案数 首先我们可以预处理出所有一行中没有两个相 ...

  9. 洛谷 P1879 [USACO06NOV]玉米田 解题报告

    P1879 [USACO06NOV]玉米田Corn Fields 题目描述 农场主\(John\)新买了一块长方形的新牧场,这块牧场被划分成\(M\)行\(N\)列\((1 ≤ M ≤ 12; 1 ≤ ...

  10. P1879 [USACO06NOV]玉米田Corn Fields(状压dp)

    P1879 [USACO06NOV]玉米田Corn Fields 状压dp水题 看到$n,m<=12$,肯定是状压鸭 先筛去所有不合法状态,蓝后用可行的状态跑一次dp就ok了 #include& ...

随机推荐

  1. Python 列表(List)Ⅰ

    Python 列表(List) 序列是Python中最基本的数据结构.序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推. Python有6个序列的内置类型 ...

  2. 13. ClustrixDB 基于时间点恢复

    在不太可能发生灾难的情况下,可以在特定数据库.表或整个集群上执行ClustrixDB集群的某个时间点恢复.应该非常小心地处理这一问题. 先决条件 在你可以使用时间点恢复之前,你的集群应该有几个先决条件 ...

  3. ubuntu 微信安装

    安装过程: 下载最新版本tar.gz压缩包https://github.com/geeeeeeeeek/electronic-wechat/releases/download/V2.0/linux-x ...

  4. jdk java 环境变量配置

    下载 下载JDK 64 位 wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fw ...

  5. RedHat下yum配置为本地或者CentOs

    由于RedHat公司将yum源作为服务给用户提供,所以不能free给大家确实挺失望的,不过还好能够在RedHat上配置本地的Yum源,或者CentOS的Yum源. 这里提供两种方式,一种是配置本地的, ...

  6. [CSP-S模拟测试]:Smooth(数学)

    题目传送门(内部题84) 输入格式 两个整数$B,K$ 输出格式 一个整数表示答案 样例 样例输入: 5 100 样例输出: 数据范围与提示 对于$40\%$的数据,保证答案小于$10^7$对于另$2 ...

  7. 说下Java堆空间结构,及常用的jvm内存分析命令和工具

    Java堆空间结构图:http://www.cnblogs.com/SaraMoring/p/5713732.html JVM内存状况查看方法和分析工具: http://blog.csdn.net/n ...

  8. 15 可视化工具 Navicat的简单使用

    本节重点: 掌握Navicat的基本使用 # PS:在生产环境中操作MySQL数据库还是推荐使用命令行工具mysql,但在我们自己开发测试时,可以使用可视化工具Navicat,以图形界面的形式操作My ...

  9. 20175308 2018-2019-2 实验四 《Android开发基础》实验报告

    20175308 2018-2019-2 实验四 <Android开发基础>实验报告 实验要求 参考 Android开发简易教程 完成云班课中的检查点,也可以先完成实验报告,直接提交.注意 ...

  10. CentOS7--删除virbr0

    https://blog.csdn.net/aienjoy/article/details/78994128