题意:给出个N*M的矩阵,1可以放,0不可以放,相邻之间不能放,求放的方法数。
思路:最后有bug,还是参考的@ZeroClock大神。。。
poj 1185炮兵阵地的简化版。
#include<iostream> #include<cstdio> #include<cstring> #define Mod 100000000 using namespace std; int dp[15][4200]; int map[15][15] , h[15] , acc[4200]; int n , m , top; void init() { int i , j , state; for(i = 0 ; i < n ; i ++) { state = 0; for(j = 0 ; j < m ; j ++) { state = state << 1; if(map[i][j]==1) state += 1; } h[i] = state; } top = 0; for(j = 0 ; j <(1<<m) ; j ++) { if(j&(j<<1)) continue; acc[top++] = j; } } int main() { int i , j , k; int k1 , k2; while(~scanf("%d%d",&n,&m)) { for(i = 0 ; i < n ; i ++) for(j = 0 ; j < m ; j ++) scanf("%d",&map[i][j]); init(); memset(dp , 0 , sizeof(dp)); for(j = 0 ; j < top ; j ++) { k = acc[j]; if((k & h[0]) == k) { dp[0][k] = 1; //printf("运行 %d\n",k); } } int sum; for(i = 1 ; i < n ; i ++) { for(j = 0 ; j < top ; j ++) { k1 = acc[j]; if((k1 & h[i])==k1) { sum = 0; for(k = 0 ; k < (1<<m) ; k ++) { if(!(k & k1)) sum += dp[i-1][k]%Mod; } dp[i][k1] = sum; } } } int cnt = 0; for(j = 0 ; j <(1<<m) ; j ++) cnt += dp[n-1][j]%Mod; printf("%d\n",cnt%Mod); } }