题目链接: http://poj.org/problem?id=3254
题意:给出一个二维矩阵,求选取其中一些互不相邻元素的选法总数。
状态压缩题目,看过炮兵阵地后,这一题就简单多了,不过郁闷的是跟一个错误的代码对拍数据好久,害得都不敢交了...
#include<stdio.h>
#include<string.h>
#define Mod 100000000
int 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;
}