【进阶指南】玉米田【状压DP】

本文介绍了农夫约翰在M×N的田地中种植玉米的问题,其中部分土地不适宜种植,且相邻土地不能同时种植。通过动态规划方法求解不同种植方案的总数,对108取模后的结果。文章详细阐述了动态规划的状态定义、合法状态的预处理以及状态转移的核心思想,并给出了代码实现。

Date:2022.04.08
题意描述:
农夫约翰的土地由 M×N 个小方格组成,现在他要在土地里种植玉米。
非常遗憾,部分土地是不育的,无法种植。
而且,相邻的土地不能同时种植玉米,也就是说种植玉米的所有方格之间都不会有公共边缘。
现在给定土地的大小,请你求出共有多少种种植方法。
土地上什么都不种也算一种方法。
输入格式
第 1 行包含两个整数 M 和 N。
第 2…M+1 行:每行包含 N 个整数 0 或 1,用来描述整个土地的状况,1 表示该块土地肥沃,0 表示该块土地不育。
输出格式
输出总种植方法对 108 取模后的值。
数据范围
1≤M,N≤12
输入样例:
2 3
1 1 1
0 1 0
输出样例:
9

思路:f[i][j]:f[i][j]:f[i][j]:已在前iii行放完,且第iii行放玉米的状态为jjj的合法方案数。
首先我们注意到每一行都有荒地,我们标记huang[i]huang[i]huang[i]为第iii行荒地的状态,这一位值为1则表示这个点是荒地。
首先我们最新放的第iii行状态要合法,即:第iii行不能存在连续两个1。因此我们预处理出所有的单行合法状态,之后枚举每一行状态时只枚举这些合法状态即可。
核心思想分三步:
①枚举每一行。
②枚举第iii行放的状态aaa。排除不合法的状态,若碰上荒地上还是1的状态就不合法,也就是要让a&huang[i]==0a\&huang[i]==0a&h

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值