题目链接

数据范围这么小,难度又这么大,一般就是状态压缩DP了。

对输入进行处理,二进制表示每一行的草地状况。如111表示这一行草地肥沃,压缩成7.

所以f[i][j]表示第i行状态为j时的方案数

状态j指的是一个二进制集合,有牛在吃草的位置是1,不再吃草的位置是0

f[i][j]=Sum(f[i-1][k])

限制:(1) j必须是草地状况的子集。很好理解,如果有牛在贫瘠草地上吃草……会被投诉到动物保护协会的

(2) j 的相邻两个位置不能都是1。 代码表示为!(j&(j<<1)

(3) k 的上述两个限制。

(4) k和j没有交集。这样可以保证没有相邻两个位置是1。

代码如下

#include<cstdio>
#include<cctype>
#include<cstdlib>
#include<iostream>
#define mod 100000000
#define Max ((1<<m)-1)
using namespace std; inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} int f[][]={};
int s[]; int ans;
int main(){
int n=read(),m=read();
for(int i=;i<=n;++i)
for(int j=;j<=m;++j){
int x=read();
s[i]=(s[i]<<)+x;
}
for(int i=;i<=n;++i)
for(int j=;j<=Max;++j){
if(((j|s[i])!=s[i])||(j&(j<<))) continue;
for(int k=;k<=Max;++k){
if(((k|s[i-])!=s[i-])||(k&(k<<))||(k&j)) continue;
f[i][j]=(f[i][j]+f[i-][k])%mod;
}
}
for(int i=;i<=Max;++i)
ans=(ans+f[n][i])%mod;
printf("%d",ans);
return ;
}

最新文章

  1. 判断一个对象是jQuery对象还是DOM对象
  2. r.js结合gulp等于webpack(angular为例)
  3. doT.js源码解读
  4. openCV_java Canny边缘检测
  5. 在uwp仿制WPF的Window
  6. PHP startsWith and endsWith
  7. ADF_ADF Faces系列1_使用JSF开发基于Ajax的用户界面:ADF Faces 富客户端组件简介(Part1)
  8. hdoj 2023 求平均成绩
  9. 用Bootstrap 写了个站点
  10. Javascript 拖拽的一些简单的应用——逐行分析代码,让你轻松了解拖拽的原理
  11. struts2.0的工作原理?
  12. 关于 Go 中 Map 类型和 Slice 类型的传递
  13. 201521123029《Java程序设计》第1周学习总结
  14. Rem与Px的转换[转载]
  15. nyoj 概率计算
  16. Keil相关问题
  17. Python学习笔记五
  18. html中radio单选和文本框限制只能输入数字的解决方案
  19. zabbix3.4.7安装在centos 7.4上
  20. 基于jquery结婚电子请柬特效素材

热门文章

  1. MySQL存储引擎问题
  2. 在ABAP里模拟实现Java Spring的依赖注入
  3. 转载:收费版APP三年总结(个人经验+数据图分享)
  4. Thread源码分析-java8
  5. 卷积网络中的通道(Channel)和特征图
  6. CAD交互绘制mcdbsolid对象(网页版)
  7. JS实现跑马灯效果(向左,向上)
  8. Airbnb:别抵制我,宝宝要过 10 岁生日
  9. 全面解读Oracle同义词的概念作用、创建删除查看及Oracle的db link
  10. oracle row_number的使用