思路见点击打开链接的第二种解法
AC代码如下:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
long long dp[2][1<<12];
int N, M;
int main(){
while( scanf( "%d%d", &N, &M ) != EOF ){
memset( dp, 0, sizeof( dp ) );
if( N < M ){
swap( N, M );
}
int now, pre;
now = 0;
pre = 1;
dp[now][(1<<M)-1] = 1;
for( int i = 0; i < N; i++ ){
for( int j = 0; j < M; j++ ){
swap( now, pre );
memset( dp[now], 0, sizeof( dp[now] ) );
for( int k = 0; k < (1<<M); k++ ){
if( j && !( k & (1<<(j-1)) ) && ( k & (1<<j) ) ){
dp[now][k|(1<<(j-1))] += dp[pre][k];
}
dp[now][k^(1<<j)] += dp[pre][k];
}
}
}
cout << dp[now][(1<<M)-1] << endl;
}
return 0;
}