Corn Fields
Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 9295   Accepted: 4940

Description

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.

没见过比这个还标准的状态dp了,搞一下骨牌覆盖的那种题会瞬间有做这题的思路的。一开始没想到result数组里面的数值可能会超,WA了几次,最后发现结果有负数改过来了就AC了。

代码:

#include <iostream>
#include <vector>
#include <string>
#include <cstring>
#include <algorithm>
#pragma warning(disable:4996)
using namespace std; int n,m;
int state[15][15];
long long result[15][(1<<13)-1]; bool pend_ok(int pend,int row[])
{
int i;
for(i=n;i>=1;i--)
{
int wei =pend & 1;
if(row[i]== 0 &&wei==1)//11001
{
return false;
} pend = pend>>1; int wei2=pend&1; if(wei&&wei2)
return false;
}
return true;
} bool pend(int j,int k )
{
int i;
for(i=1;i<=n;i++)
{
int wei1 = j&1;
int wei2 = k&1; if(wei1==1&&wei2==1)
{
return false;
}
j=j>>1;
k=k>>1;
}
return true;
} int main()
{
int i,j,k;
cin>>m>>n; for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
scanf_s("%d",&state[i][j]);
}
} int n1=(1<<n)-1; memset(result,0,sizeof(result)); for(j=0;j<=n1;j++)
{
if(pend_ok(j,state[1]))
{
result[1][j]=1;
}
} for(i=2;i<=m;i++)
{
for(j=0;j<=n1;j++)
{
for(k=0;k<=n1;k++)
{
if(pend_ok(j,state[i])&&pend(j,k))
{
result[i][j] += result[i-1][k];
if(result[i][j]>100000000)//result的值可能会超过,这里要先过滤一下!!!(之前没过滤导致wrong)
result[i][j]=result[i][j]-100000000;
}
}
}
}
long long max=0;
for(j=0;j<=n1;j++)
{
max +=result[m][j];
max=max%100000000;
} cout<<max%100000000<<endl; return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

POJ 3254:Corn Fields的更多相关文章

  1. POJ 3254:Corn Fields(状态压缩DP)

    题目大意:一个矩形的草地,分为多个格子,有的格子可以有奶牛(标为1),有的格子不可以放置奶牛(标为0),计算摆放奶牛的方案数. 分析: f[i,j]表示第i行状态为j的方案总数. 状态转移方程f[i, ...

  2. POJ 3254 poj3254 Corn Fields

    题意:给出一个n行m列的草地,1表示肥沃,0表示贫瘠,现在要把一些牛放在肥沃的草地上,但是要求所有牛不能相邻,问你有多少种放法. 思路: DP[i][j]=sum(dp[i-1][k]); i表示当前 ...

  3. POJ3254:Corn Fields(状压dp第一发)

    题目:http://poj.org/problem?id=3254 直接上代码吧,刚开始做时主要的问题就是看不懂二进制,有个博客写的太好了,就直接把题解复制在下面了. #include <ios ...

  4. POJ3254:Corn Fields——题解

    http://poj.org/problem?id=3254 题面来自洛谷:https://www.luogu.org/problemnew/show/1879 农场主John新买了一块长方形的新牧场 ...

  5. Corn Fields POJ - 3254 (状压dp)

    题目链接: Corn Fields  POJ - 3254 题目大意:给你一个n*m的矩阵,矩阵的元素只包括0和1,0代表当前的位置不能放置人,1代表当前的位置可以放人,当你决定放人的时候,这个人的四 ...

  6. POJ 3254. Corn Fields 状态压缩DP (入门级)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9806   Accepted: 5185 Descr ...

  7. poj 3254 Corn Fields

    http://poj.org/problem?id=3254 Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissio ...

  8. 状压DP POJ 3254 Corn Fields

    题目传送门 /* 状态压缩DP:先处理硬性条件即不能种植的,然后处理左右不相邻的, 接着就是相邻两行查询所有可行的种数并累加 写错一个地方差错N久:) 详细解释:http://www.tuicool. ...

  9. POJ 3254 Corn Fields(状压DP)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13732   Accepted: 7216 Desc ...

随机推荐

  1. Sublime设置html头部

    1.Ctrl + N,新建一个文档:2.Ctrl + Shift + P,打开命令模式,再输入 sshtml 进行模糊匹配,将语法切换到html模式:3.输入 !,再按下 Tab键或者 Ctrl + ...

  2. 二 基于java动态数组手写栈

    package dataStucture2.stack; import dataStucture2.array.MyDynamicArray; /** * 基于动态数组手写栈 * 设计时,栈中仅栈顶对 ...

  3. 一 SpringMvc概述&入门配置

    SpringMVC: 类似Struts2的MVC框架,属于SpringFrameWork的后续产品. 与Struts2的区别: 参数传递:  Struts2通过模型驱动,属性设置set方法,值栈.类级 ...

  4. 三星 S10 运行 Ubuntu 系统

    导读 DeX 是一种模仿桌面操作系统的用户 UI 界面,把支持 DeX 的三星手机用数据线连上外置显示器,用户就可以获得一种类似桌面系统的使用体验. 三星 S8.Note 8.S9.Note 9.S1 ...

  5. SC.Lab3对于Factory的构建过程(from HIT)

    Factory设计模式基本就是通过传入指定的参数/或者不传入参数,通过Factory的某个方法(为了避免实例化Factory对象,一般方法为静态static),来获取一个对象.这个是Factory用的 ...

  6. android 动态壁纸开发

    转:http://www.eoeandroid.com/thread-100389-1-1.html android 动态壁纸开发参考:http://www.ophonesdn.com/article ...

  7. ch13 事件(思维导图)

  8. [易语言][ExDui][Tutorial]1.NameSelector

    咕咕咕 尝试自己写组件对象被易语言的对象劝退后,我又回来写教程了. 相信上一章对如何创建窗口讲得足够透彻了,这一章上项目实战:点名器. 点名器这种简单的东西实在是经常被拿出来开刀啊. 还有一点,发现之 ...

  9. 085、Java数组之实现排序

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  10. Linux关于文件处理命令

    一.登陆用户和机器名称 示例:[root@hadoop01 ~]# root:表示用户名 @hadoop01表示机器名称 ~表示当前文件目录是家目录 #表示输入命令提示符,用户可以在其后输入命令:非r ...