牧场的安排

题目描述

Farmer John 新买了一块长方形的牧场,这块牧场被划分成 MN 列 (1≤M≤12;1≤N≤12),每一格都是一块正方形的土地。FJ 打算在牧场上的某几格土地里种上美味的草,供他的奶牛们享用。遗憾的是,有些土地相当的贫瘠,不能用来放牧。并且,奶牛们喜欢独占一块草地,于是 FJ 不会选择两块相邻的土地,即:没有哪两块草地有公共边。当然,FJ 还没有决定在哪些土地上种草。

作为一个好奇的农场主,FJ 想知道,如果不考虑草地的总块数,那么,一共有多少种种植方案可供他选择。当然,把新的牧场荒废,不在任何土地上种草,也算一种方案。请你帮 FJ 算一下这个总方案数。

输入

第 1行:两个正整数 MN,用空格隔开;第 2到 M+1 行:每行包含 N 个用空格隔开的整数,描述了每块土地的状态。输入的第 i+1 行描述了第 i 行的土地。所有整数均为 0 或 1,1 表示这块土地足够肥沃,0则表示这块地上不适合种草。

输出

第 1行:输出一个整数,即牧场分配总方案数除以 10^8 的余数。

样例输入
2 3  
1 1 1  
0 1 0
样例输出
9
提示

样例说明

按下图把各块土地编号:

1 2 3  

0 4 0

只开辟一块草地有 4种方案:选 1,2,3,4 中的任一块。开辟两块草地的话,有 3 种方案:13,14 以及 34。选三块草地只有一种方案:134。再加把牧场荒废的那一种,总方案数为 4+3+1+1=9种。

数据范围与提示:

1≤N,M≤12

#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#define int long long
using namespace std;
int i,j,k,x,n,m,ans,f[1001],dp[30][70000],T,mod=100000000;
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	cin>>n>>m;
	T=(1<<m);
	dp[0][0]=1;
	for(i=1; i<=n; i++)
		for(j=1; j<=m; j++) {
			cin>>x;
			if(!x)f[i]+=(1<<(m-j));
		}
	for(i=1; i<=n; i++)
		for(j=0; j<T; j++)
			for(k=0; k<T; k++)
				if(!(j&f[i])&&!(j&(j<<1))&&!(j&k))
					dp[i][j]+=dp[i-1][k],dp[i][j]%=mod;
	for(i=0; i<T; i++)
		ans+=dp[n][i];
	cout<<ans%mod;
}

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值