poj 3254 Corn Fields 状态压缩

来源:互联网 发布:mac os系统iso镜像下载 编辑:程序博客网 时间:2024/05/22 15:35
Corn Fields
Time Limit: 2000MS Memory Limit: 65536KTotal Submissions: 6321 Accepted: 3361

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 31 1 10 1 0

Sample Output

9

Hint

Number the squares as follows:
1 2 3  4  
第三个状态压缩 感觉智商遭到了侮辱 ∑(゚Д゚ノ)ノ
大意: 有一块由n*m个方格组成的农田,有些方块能种植谷物,有些方块不能种植谷物,现在fj有一些牛,这些牛吃谷物时各占一个方格,并且互不相邻,牛的数量不定并且牛只能在有农作物的方格里吃,给你田中每个方格的状态(0为可以种植 否则1),问有几种安排牛的方案。
解:牛的数量首先<=田中可以种植的方块的数量,详解如图:
下面是参考别的大神的代码 自己敲了个Orz(~ ̄▽ ̄)~(~ ̄▽ ̄)~ 一定要搞清楚 用十进制代表状态的思想
#include <iostream>#include <string.h>#include <algorithm>#include <stdio.h>#define N 12using namespace std;const  int maxx=1<<12;const int mod=1e8;int k;int dp[15][maxx];int sto[maxx];int a[15],n,m;bool judge(int x){if (x&x<<1) return false;return true;}void init(){    int v=1<<m;     k=0;    for (int i=0;i<v;i++)    {    if (judge(i)) sto[++k]=i;}}bool base(int i,int l){if (i&a[l]) return false;return true;}int main(){int ans,v;   while (~scanf("%d%d",&n,&m))   {   init();      memset(dp,0,sizeof(dp));      ans=0;      for (int i=1;i<=n;i++)      {      a[i]=0;for (int j=1;j<=m;j++){    scanf("%d",&v);if (v==0)a[i]+=(1<<(m-j));}    for (int i=1;i<=k;i++)//给第一行设个初值    {    if (base(sto[i],1)) dp[1][i]=1;    }       }       for (int i=2;i<=n;i++) //从第二行开始累加           for (int j=1;j<=k;j++)           {              if (!base(sto[j],i)) continue;   for (int q=1;q<=k;q++)   {     if (!base(sto[q],i-1))continue;     if (sto[j]&sto[q])continue;     dp[i][j]=(dp[i][j]+dp[i-1][q])%mod;   }    }           for (int i=1;i<=k;i++)      ans=(ans+dp[n][i])%mod; //计算第n行一共统计了多少种状态了      printf("%d\n",ans);      }      return 0;} 

阅读全文
0 0
原创粉丝点击