#zYDPybttg050402. 1593:【例 2】牧场的安排
1593:【例 2】牧场的安排
好的,我将这道题整理为清晰的题面格式,并补充样例解释、数据范围与时空限制:
题目描述
原题来自:USACO 2006 Nov. Gold
Farmer John 新买了一块长方形的牧场,这块牧场被划分成 行 列 ,每一格都是一块正方形的土地。FJ 打算在牧场上的某几格土地里种上美味的草,供他的奶牛们享用。遗憾的是,有些土地相当的贫瘠,不能用来放牧。并且,奶牛们喜欢独占一块草地,于是 FJ 不会选择两块相邻的土地,即:没有哪两块草地有公共边(上下左右相邻)。当然,FJ 还没有决定在哪些土地上种草。
作为一个好奇的农场主,FJ 想知道,如果不考虑草地的总块数,那么,一共有多少种种植方案可供他选择。当然,把新的牧场荒废,不在任何土地上种草,也算一种方案。请你帮 FJ 算一下这个总方案数。输出答案对 取模的结果。
输入格式
- 第 行:两个正整数 和 ,用空格隔开;
- 第 到 行:每行包含 个用空格隔开的整数,描述了每块土地的状态。输入的第 行描述了第 行的土地。所有整数均为 或 , 表示这块土地足够肥沃, 则表示这块地上不适合种草。
输出格式
输出一个整数,即牧场分配总方案数除以 的余数。
样例
样例输入
2 3
1 1 1
0 1 0
样例输出
9
样例说明
牧场土地(1表示肥沃,0表示贫瘠):
1 1 1
0 1 0
按位置编号:
(1,1) (1,2) (1,3)
(2,1) (2,2) (2,3)
其中肥沃的土地有:(1,1),(1,2),(1,3),(2,2)。
方案数:
- 不种任何草:1 种
- 只种一块草地:选 (1,1) 或 (1,2) 或 (1,3) 或 (2,2),共 4 种
- 种两块草地(不能相邻):
- (1,1) 和 (1,3)
- (1,1) 和 (2,2)
- (1,3) 和 (2,2) 共 3 种
- 种三块草地:只能选 (1,1),(1,3),(2,2),共 1 种
总方案数:。
数据范围
对于全部数据,。
时空限制
- 时间:
- 内存:
提示
此题为 状态压缩 DP 问题,类似“玉米田”问题。
状态设计:
- 用二进制数表示一行的种植情况: 表示种, 表示不种;
- 状态必须满足:
- 同一行内不能有两个相邻的 (因为不能左右相邻);
- 状态中的 只能出现在肥沃的土地上(即对应的格子必须为 ,否则不能种)。
- 相邻两行之间,上下不能同时为 (因为不能上下相邻)。
设 表示前 行,且第 行状态为 的方案数。
转移方程:
其中 是第 行的状态,且满足:
- 与 没有上下相邻的 (即 );
- 和 各自内部没有左右相邻的 ;
- 必须与第 行的肥沃情况兼容(即 的 位对应位置的土地必须为 )。
初始化:(第 行,不种任何草地)。
最终答案:
优化:
- 预处理所有合法行状态(无相邻 );
- 预处理状态间的兼容性(上下不冲突);
- 对于每行,预处理该行允许的状态(状态中的 必须对应肥沃土地)。
复杂度:,其中 是合法行状态数,对于 ,,但实际合法状态少得多(约几百个),可以接受。