Poj3254 状态压缩DP

来源:互联网 发布:完美国际单机版数据库 编辑:程序博客网 时间:2024/04/29 23:18

题目链接: http://poj.org/problem?id=3254

 

题意:给出一个二维矩阵,求选取其中一些互不相邻元素的选法总数。

 

状态压缩题目,看过炮兵阵地后,这一题就简单多了,不过郁闷的是跟一个错误的代码对拍数据好久,害得都不敢交了...

 

 

 

 

#include<stdio.h>#include<string.h>#define Mod 100000000int legal[378],ls;int dp[16][378];int map[16];int n,m;bool Legal(int x){return !(x&(x<<1));}int main(){int i,j,c,h;scanf("%d%d",&n,&m);for(i=0;i<(1<<m);i++){if(Legal(i))legal[ls++]=i;}for(i=0;i<n;i++){for(j=0;j<m;j++){scanf("%d",&c);map[i]|=(!c)<<j;}}for(i=0;i<ls;i++)dp[0][i]=!(legal[i]&map[0]);for(h=1;h<n;h++){for(i=0;i<ls;i++){if(legal[i]&map[h])  continue;for(j=0;j<ls;j++){if(legal[j]&legal[i]) continue;dp[h][i]+=dp[h-1][j];dp[h][i]%=Mod;}}}for(h=i=0;i<ls;i++){h+=dp[n-1][i];h%=Mod;}printf("%d\n",h%Mod);return 0;}