题目大意:在M*N的土地上种植玉米,有些地方不能种植,而且相邻两个不能都种。
思路:状态压缩dp(比炮兵阵地简单)。将每一排的N个看成一个N位2进制数,初始化的时候可以去掉很多无效的状态(如110..),然后dp,当前有效状态和上一行有效状态的关系。
#include <stdio.h>
struct Line{
int num;
int state[1024];
// int n1[1024];
}line[15];
int dp[15][1024]={0};
int m, n;
void GetState( int i, int tmp )
{
int j;
int num = 0;
for ( j=0; j<(1<<n); j++ )
{
if ( (j<<1)&j || (j>>1)&j )
continue;
if ( tmp&j )
continue;
/* int m = j;
line[i].n1[num] = m%2;
while ( m=(m>>1) )
line[i].n1[num] += m%2;
*/ line[i].state[num++] = j;
}
line[i].num = num;
}
int main ()
{
int i, j, k;
int a;
scanf("%d %d", &m, &n );
for ( i=0; i<m; i++ )
{
int tmp = 0;
for ( j=0; j<n; j++ )
{
scanf("%d", &a );
tmp = (tmp<<1) + 1-a;
}
GetState( i, tmp );
}
for ( i=0; i<line[0].num; i++ )
dp[0][i] = 1;
for ( i=1; i<m; i++ )
{
for ( j=0; j<line[i].num; j++ )
{
dp[i][j] = 0;
for ( k=0; k<line[i-1].num; k++ )
{
if ( (line[i].state[j])&(line[i-1].state[k]) )
continue;
dp[i][j] += dp[i-1][k];
}
}
}
int ans = 0;
for ( i=0; i<line[m-1].num; i++ )
ans = (ans+dp[m-1][i])%100000000;
printf("%d/n", ans );
return 0;
}