本题与上一题AcWing 1064. 小国王(棋盘式状压dp)几乎一致,只不过上一题是“井字形的约束摆放”,而本题是“十字形的约束摆放”,即:当前位置上下左右 4 个方向不能摆放棋子

题意:

给定一个 n×m01 矩阵,0 的位置不能放置棋子,1 的位置能放置棋子

若在坐标 (x,y) 放置了棋子,则 四相邻 的位置上 不能 放置棋子

求摆放的 方案数,答案对 1e8 取模

思路:

本题比较上一题要进行额外处理的,是给定的 01 矩阵里存在不能放置棋子的位置

我们用二进制存储的状态 state 中,使用 1 表示在该位置 放置棋子0 表示在该位置 没有棋子

因此我们可以把矩阵每一层的状态也用二进制来压缩存储,且与题目给定的设定(“1 表示该块土地肥沃,0 表示该块土地不育”)相反,我们用 0 表示该位置能放棋子,1 表示不能放

这样,只需把枚举的状态 state(current)矩阵这一层的状态 state(gi)& 运算即可:

  • ① 结果为 0,表示 放置棋子 的位置没有与 不能放置棋子 的位置重叠,则该状态 合法
  • ② 结果为 1,表示 放置棋子 的位置与 不能放置棋子 的位置发生重叠,则该状态 不合法

此外,两个合法的状态如果能互相转移,根据“十字形”的摆放规则,两者也需要满足相 & 结果为 0

如果要看本题与“井字形”进行辨析以及状态转移和状态计算等其他细节的话,可以看上一道题:AcWing 1064. 小国王(棋盘式状压dp 井字形),两者是类似的。

时间复杂度:

状态数量n × 2 ^ n)× 转移数量(即划分的集合数量2 ^ n)= n × 2 ^ (2n)(和上题类似,实际用到的状态数量很少,所以可以过)

代码

#include<bits/stdc++.h>using namespace std;const int N = 14, M = 1<<N, mod = 1e8;
vector<int> state;
vector<int> head[M];
int g[N];
int m, n;
int dp[N][M];bool check(int st)
{for(int i=0; i<n-1; ++i) if((st>>i&1) && (st>>(i+1)&1)) return false;return true;
}int main()
{cin>>m>>n;for(int i=1; i<=m; ++i){for(int j=0; j<n; ++j){int t;cin>>t;g[i] += (!t)<<j; //和题设取反}}for(int i=0; i<1<<n; ++i) if(check(i)) state.push_back(i);for(int i=0; i<state.size(); ++i)for(int j=0; j<state.size(); ++j){int a = state[i], b = state[j];if(!(a&b)) head[a].push_back(b);}dp[0][0] = 1;for(int i=1; i<=m+1; ++i){for(auto a : state){if(a & g[i]) continue;for(auto b : head[a]){dp[i][a] = (dp[i][a] + dp[i-1][b]) % mod;}}}cout<<dp[m+1][0]<<endl;return 0;
}

AcWing 327. 玉米田(棋盘式状压dp 十字形)相关推荐

  1. [USACO06NOV]玉米田Corn Fields (状压$dp$)

    题目链接 Solution 状压 \(dp\) . \(f[i][j][k]\) 代表前 \(i\) 列中 , 已经安置 \(j\) 块草皮,且最后一位状态为 \(k\) . 同时多记录一个每一列中的 ...

  2. AcWing 327. 玉米田(状态压缩DP)

    AcWing 327. 玉米田(状态压缩DP) 一.问题 二.分析 1.思路 2.状态表示 3.状态转移 4.循环设计 5.初末状态 三.代码 一.问题 二.分析 1.思路 这道题与之前所讲解的AcW ...

  3. acwing 327. 玉米田

    327. 玉米田 题意: m * n的土地,有的土地不育,有的可以种植,要求相邻的土地不能同时种植玉米,问有多少种种植方式 题解: 状压dp,先存每一行可能的状态,然后状态转移,注意相邻不能同时种植除 ...

  4. AcWing 327 玉米田

    题目描述: 农夫约翰的土地由M*N个小方格组成,现在他要在土地里种植玉米. 非常遗憾,部分土地是不育的,无法种植. 而且,相邻的土地不能同时种植玉米,也就是说种植玉米的所有方格之间都不会有公共边缘. ...

  5. bzoj 5248: [2018多省省队联测]一双木棋 博弈论+状压dp

    题意 菲菲和牛牛在一块n行m列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手.棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结束.落子的规则是:一个格子可以落子当且仅当这个格子内没 ...

  6. 【AcWing 327. 玉米田】状压dp

    题目链接 题意: 农夫约翰的土地由 M×N 个小方格组成,现在他要在土地里种植玉米. 非常遗憾,部分土地是不育的,无法种植. 而且,相邻的土地不能同时种植玉米,也就是说种植玉米的所有方格之间都不会有公 ...

  7. AcWing 327 玉米田 题解 (动态规划—DP—状态压缩DP)

    原题传送门 #include<bits/stdc++.h>using namespace std;const int N = 14, M = 1 << 12, mod = 1e ...

  8. ACWing 327. 玉米田(状态压缩dp入门)

    农夫约翰的土地由M*N个小方格组成,现在他要在土地里种植玉米. 非常遗憾,部分土地是不育的,无法种植. 而且,相邻的土地不能同时种植玉米,也就是说种植玉米的所有方格之间都不会有公共边缘. 现在给定土地 ...

  9. 刷题周记(九)——#状压DP:最短Hamilton路径、小国王(互不侵犯)、玉米田(Corn Fields G)、愤怒的小鸟、吃奶酪、炮兵阵地、宝藏 #区间DP:清空字符串#DP:关灯问题II

    文章目录 --2020年12月20日(周日)------------------ 状压DP 一.最短Hamilton路径(模板题) 二.玉米田(P1879 [USACO06NOV]Corn Field ...

最新文章

  1. Linux平台下Eclipse的安装
  2. 英伟达Tesla P100超级计算机组件全面登陆PCIe总线
  3. cnn卷积中padding作用
  4. 安装 VMware Workstation Pro 16 并创建 ubuntu 20.04 虚拟机
  5. android 可以搜索到热点 连接时显示未找到热点_魔兽世界地精经典语录:时间就是金钱!8266互联网时间显示器教程...
  6. Winform控件WebBrowser与JS脚本交互
  7. sql 解锁被锁定的账号
  8. 武汉大学计算机学院c404,985录取名单(武大)!武大不歧视!80分政治复习路线图!最新调剂信息!...
  9. Mongodb~连接串的整理
  10. Modbus PLC攻击分析:Smod渗透框架研究
  11. SpringMVC12拦截器
  12. php官网软件下载,php下载_php官方下载_3DM软件
  13. python云台控制原理_python伺服云台摄像头图像作为背景
  14. sublime运行python输出乱码_sublime python出现中文乱码怎么办
  15. 铃木雅臣晶体管电路设计学习笔记1
  16. Unity-背包系统与Json文本解析
  17. 关于idea链接oracle数据库出现IO 错误: Got minus one from a read call, connect lapse 1 ms., Authen
  18. 【JZOJ4587】Snow的追寻 题解
  19. vue获取地址栏参数
  20. iOS开发者程序许可协议

热门文章

  1. 视频转音频用什么软件?亲测好用的软件分享
  2. NLP —— 文本预处理
  3. RAW图像:安卓手机拍摄 Matlab数据读取
  4. [渝粤教育] 中国矿业大学 高级语言程序设计 参考 资料
  5. 运维堡垒机深信服平台操作-安装控件调用客户端工具
  6. Java spark parallelizePairs Incompatible equality constraint: String and T1
  7. 周以真教授认为计算思维是运用计算机科学,计算思维与项目教学法
  8. 网赚项目,什么才是长期有效的引流方法?
  9. 关于入门SDR,各种板子了解,以及等等等,,好记性不如乱博客
  10. mysql中一般用什么字符集_MySql常用字符集