3254:Corn Fields

問題文
http://poj.org/problem?id=3254

グリッドが与えられる。マスの数が1であるようなもののうちで、それぞれ4近傍に隣接しないような選び方がいくつあるか求めよ。









































1行を覚えておくDP。
dp[ マスの番号 ][ 直前の1行の状態 ] := 場合の数

#include<iostream>
#include<algorithm>

#define mod 100000000

using namespace std;

int dp[145][1<<12];

int main(void){

  int n,m,g[12][12],in;

  cin >> n >> m;

  for(int i=0;i<n;i++)
    for(int j=0;j<m;j++)cin >> g[i][j];

  dp[0][0]=1;

  for(int i=0;i<n*m;i++){
    int x=i%m,y=i/m;
    for(int S=0;S<(1<<m);S++){
      int nx=(S<<1)&~(1<<m);
      dp[i+1][nx]+=dp[i][S];
      dp[i+1][nx]%=mod;

      if(g[y][x] && !((S&1)*x) && !((S>>(m-1))&1)){
        dp[i+1][nx|1]+=dp[i][S];
        dp[i+1][nx|1]%=mod;
      }
    }
  }

  int ans=0;
  for(int i=0;i<(1<<m);i++)ans+=dp[n*m][i];

  cout << ans%mod << endl;

  return 0;
}