P1879 玉米田Corn Fields题解

本文介绍了洛谷P1879题目——玉米田Corn Fields的解决方案,重点是使用状态压缩和动态规划(状压DP)的方法。文章详细讲解了如何将每行的状态用二进制表示,并通过位运算判断种植方案的合法性,包括避免0位置种草和连续草丛的约束。最后,提供了满足条件的动态转移方程和代码实现。
摘要由CSDN通过智能技术生成

洛谷 P1879
链接: P1879 玉米田Corn Fields.

农场主John新买了一块长方形的新牧场,这块牧场被划分成M行N列(1 ≤ M ≤ 12; 1 ≤ N ≤ 12),每一格都是一块正方形的土地。John打算在牧场上的某几格里种上美味的草,供他的奶牛们享用。

遗憾的是,有些土地相当贫瘠,不能用来种草。并且,奶牛们喜欢独占一块草地的感觉,于是John不会选择两块相邻的土地,也就是说,没有哪两块草地有公共边。

John想知道,如果不考虑草地的总块数,那么,一共有多少种种植方案可供他选择?(当然,把新牧场完全荒废也是一种方案)

input

2 3
1 1 1
0 1 0

output

9

看到两个数M N都小于12,第一反应就是状压,用二进制来表示每一行的状态,例如,j=13时,j 用二进制表示为 1101 ,表示1号位置种草,2号位置种草,3号位置不种草,4号位置种草。

首先输入M N ,然后输入地图,这里有一种快捷方式记录地图,相当于把每一行的状态压缩为一个数字存储,列如样例第一行 1 1 1 压缩为 7 ,这样会使后面的操作简单些

    for(int i=1;i<=m;i++)
        for(int j=0;j<n;j++){
   
            int x;
            cin>>x;
            mp[i]|=(x<<j);//记录地图信息
        }

本题有两个约束条件,第一是不能 0 位置种草,第二时不能有连续的草丛

先解决第一个条件,由于之前已经记录了压缩后的地图状态了,假设此时第 i 行地图状态为mp[i] ,第i 行的状态为k , 假设 mp[i] 二进制的第 j 位为0,那么k的第 j 位就只能是0,如果 mp[i]j 位为1,那么k的第 j 位可以是 01,这里我们用一种运算—— |,或运算

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值