算法竞赛进阶指南 玉米田 题解
2021/4/8 12:13:11
本文主要是介绍算法竞赛进阶指南 玉米田 题解,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
题目大意
农夫约翰的土地由 M×N 个小方格组成,现在他要在土地里种植玉米。
非常遗憾,部分土地是不育的,无法种植。
而且,相邻的土地不能同时种植玉米,也就是说种植玉米的所有方格之间都不会有公共边缘。
现在给定土地的大小,请你求出共有多少种种植方法。
土地上什么都不种也算一种方法。
输出总种植方法对 108 取模后的值。其中1≤M,N≤12
题解
想了两分钟,和四川省选那道题几乎是一模一样的思路,状态的话由于没有种的个数限制所以少了一维,反而更简单了
要注意的就是对于不能种的田的小技巧,由于与运算的特殊性质,我们一开始就计算好每一行的二进制数
(并且1表示不能种,方便后面与预处理的状态进行与运算)
程序
#include <iostream> #include <cstring> #include <algorithm> #include <vector> using namespace std; const int N = 14,M = 1 << 12,mod = 1e8; int f[N][M]; vector<int> head[M]; vector<int> state; int n,m; int g[N]; inline bool check(int state) { for(int i = 0; i < m - 1; ++ i) if((state >> i & 1) && (state >> i + 1 & 1)) return false; return true; } int main() { cin >> n >> m; for(int i = 1; i <= n; ++ i) for(int j = 0;j < m; ++ j) { int t; cin >> t; g[i] += !t * (1 << j); } for(int i = 0; i < 1 << m; ++ 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[i].push_back(j); } f[0][0] = 1; for (int i = 1; i <= n + 1; i ++ ) for (int j = 0; j < state.size(); j ++ ) if (!(state[j] & g[i])) for (int k : head[j]) f[i][j] = (f[i][j] + f[i - 1][k]) % mod; cout << f[n + 1][0] << endl; return 0; }
这篇关于算法竞赛进阶指南 玉米田 题解的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南