标签: ACM


题目:

Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ≤ 12) square parcels. He wants to grow some yummy corn for the cows on a number of squares. Regrettably, some of the squares are infertile and can't be planted. Canny FJ knows that the cows dislike eating close to each other, so when choosing which squares to plant, he avoids choosing squares that are adjacent; no two chosen squares share an edge. He has not yet made the final choice as to which squares to plant.

Being a very open-minded man, Farmer John wants to consider all possible options for how to choose the squares for planting. He is so open-minded that he considers choosing no squares as a valid option! Please help Farmer John determine the number of ways he can choose the squares to plant.

Input

Line 1: Two space-separated integers: M and N

Lines 2.. M+1: Line i+1 describes row i of the pasture with N space-separated integers indicating whether a square is fertile (1 for fertile, 0 for infertile)

Output

Line 1: One integer: the number of ways that FJ can choose the squares modulo 100,000,000.

Sample Input

2 3

1 1 1

0 1 0

Sample Output

9

Hint

Number the squares as follows:

1 2 3

4

There are four ways to plant only on one squares (1, 2, 3, or 4), three ways to plant on two squares (13, 14, or 34), 1 way to plant on three squares (134), and one way to plant on no squares. 4+3+1+1=9.

题意:

第一行输入草地长宽,后面输入该地方能不能使用,输出可以使用的所有方案

解题思路

从例题来看第一层有五种可能分别为000,001,010,100,101,都标记为1种可能

第二层可以有000010两种状态,但是与上一层比较000与上一层五种状态都不冲突标记为5种可能,而010与上一层010状态冲突,所以标记为4种可能

第二层为最底层,将最后一层的可能性全部相加得到9

使用状态压缩,将所有可能存在状态储存到数组里面

然后从第一层存在的状态标记为1

从第二层开始遍历到最后一层,第二层存在的状态且不和上一层冲突将上一层的状态标记加到该层的标记上

遍历到最后一层时将最后一层的状态总和加起来就是所有的可能性

注:根据题意答案要对100000000取余

AC代码

#include <iostream>
#include <string.h>
#define M 4100
#define N 15
using namespace std;
int map[N]; //该行的输入状态
int m,n;
int dp[N][M];
int p;//该列最大状态
int s[M]; //储存每一行拥有的状态最大4096种状态
int mod=100000000;
bool checkLine(int i) //该行是否满足条件
{
return !(i&(i>>1));
}
bool checkTwoLine(int i,int j) //与上一行是否冲突
{
return !(i&j);
}
bool include(int i,int j) //是否是包含关系
{
return ((i|j)==i);
}
void init()
{
p=0;
int i,j;
for(i=0;i<(1<<m);i++)
if(checkLine(i))
s[p++]=i;
}
void solve()
{
int i,j,k;
int ans=0;
for(i=0;i<p;i++)
if(include(map[0],s[i]))
dp[0][i]=1; for(i=1;i<n;i++)
for(j=0;j<p;j++) //该行的状态
{
if(!include(map[i],s[j]))
continue;
else
for(k=0;k<p;k++) //上一行的状态
{
if(include(map[i-1],s[k])&&checkTwoLine(s[j],s[k]))
dp[i][j]=(dp[i][j]+dp[i-1][k])%mod;
}
}
for(i=0;i<p;i++)
ans=(ans+dp[n-1][i])%mod;
cout<<ans<<endl;
}
int main()
{
while(cin>>n>>m)
{
memset(map,0,sizeof(map));
int i,j;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
int plant;cin>>plant;
if(plant){
map[i]+=(1<<j); //将输入转换成二进制储存
}
}
init();
solve();
} return 0;
}

状态压缩dp第一题的更多相关文章

  1. 状态压缩---状态压缩dp第一题

    标签: ACM 题目: Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; ...

  2. POJ Corn Fields 状态压缩DP基础题

    题目链接:http://poj.org/problem?id=3254 题目大意(名称什么的可能不一样,不过表达的意思还是一样的): 种玉米 王小二从小学一年级到现在每次考试都是班级倒数第一名,他的爸 ...

  3. 状态压缩DP入门题

    . /*本题为状态压缩题 题目大意 : 一个矩阵里有很多格子,每个格子有两种状态,可以放牧和不可以放牧, 可以放牧用1表示,否则用0表示,在这块牧场放牛,要求两个相邻的方 格不能同时放牛(不包括斜着的 ...

  4. Hdu-1565 方格取数(1) (状态压缩dp入门题

    方格取数(1) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  5. [NOIP2016]愤怒的小鸟 状态压缩dp

    题目描述 Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可以用它向第一象限发射一只红色的小鸟,小鸟们的飞行轨迹均为形 ...

  6. Kefa and Dishes(CodeForces580D)【状态压缩DP】

    状态压缩DP裸题,比赛的时候没反应过来,进行了n次枚举起点的solve,导致超时. #include<cstdio> #include<iostream> #include&l ...

  7. 状态压缩dp增量统计贡献——cf1238E(好题)

    这题的状态设计非常巧妙,因为dp[S]表示的并非当前正确的值,而是维护一个中间量,这个中间量在到达末状态时才正确 当然官方的题解其实更加直观,只不过理解起来其实有点困难 /* 给定一个串s,字符集为2 ...

  8. BZOJ-1226 学校食堂Dining 状态压缩DP

    1226: [SDOI2009]学校食堂Dining Time Limit: 10 Sec Memory Limit: 259 MB Submit: 588 Solved: 360 [Submit][ ...

  9. Vijos 1002 过河 状态压缩DP

    描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数轴上 ...

随机推荐

  1. Developing Universal Windows Apps 开发UWA应用 问答

    开始是一些欢迎,就不翻译 Question: Is the code already there? Answer: There is some code on that codeplex site, ...

  2. 【20171025早】alert(1) to win 练习

    本人黑绝楼,自称老黑,男,25岁,曾经在BAT工作过两年,但是一直都是底层人员,整天做重复性工作,甚敢无趣,曾和工作十年之久的同事聊天,发现对方回首过往,生活是寡淡如水,只有机械性工作.旋即老黑毅然决 ...

  3. swift 之xib自定义view可视化到storyboard

    首先直入正题:@IBInspectable & @IBDesignable 对于 @IBInspectable 和 @IBDesignable 可详见官方文档 : Creating a Cus ...

  4. iOS 之 protocol的相关问题

    定义一个协议, 一个协议可以扩展子另一个协议 如果需要扩展多个协议中间使用逗号分隔 //定义一个协议 @protocol AnimalDelegate <NSObject, ***> @r ...

  5. 基于HTML5 Canvas的3D动态Chart图表

    发现现在工业SCADA上或者电信网管方面用图表的特别多,虽然绝大部分人在图表制作方面用的是echarts,他确实好用,但是有些时候我们不能调用别的插件,这个时候就得自己写这些美丽的图表了,然而图表轻易 ...

  6. Vue-cli安装教程

    第一步:安装vue-cli npm install vue-cli -g -g :代表全局安装.如果你安装时报错,一般是网络问题,你可以尝试用cnpm来进行安装. 检测是否安装成功:可以用vue -V ...

  7. Problem H

    Problem Description 穿过幽谷意味着离大魔王lemon已经无限接近了! 可谁能想到,yifenfei在斩杀了一些虾兵蟹将后,却再次面临命运大迷宫的考验,这是魔王lemon设下的又一个 ...

  8. IdentityServer4 配置负载均衡

    如果使用 IdentityServer4 做授权服务的负载均衡,默认情况下是不可以的,比如有两个授权服务站点,一个资源服务绑定其中一个授权服务(Authority配置),如果通过另外一个授权服务获取a ...

  9. 【转载】以Java的视角来聊聊SQL注入

    以Java的视角来聊聊SQL注入 原创 2017-08-08 javatiku Java面试那些事儿 在大二就接触过sql注入,之前一直在学习windows逆向技术,认为web安全以后不是自己的从业方 ...

  10. ajax参数解析

    url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如put和 ...