新手的第一道dp
#include<bits/stdc++.h>
using namespace std;
int arr[110][11];
int dp[13][8193];
void mol(int &index) {
index = index % 100000000;
}
int main() {
int sum = 0;
int n, m;
cin >> n >> m;
for(int i=1; i<=n; ++i) {
for(int j=1; j<=m; ++j) {
cin >> arr[i][j];
}
}
for(int i=0; i<=(1<<m)-1; ++i) {
if(((i<<1) & i) != 0 || ((i>>1) & i) != 0) {
continue;
}
dp[1][i] = 1;
}
for(int i=2; i<=n; ++i) {
int s2 = 0, s3 = 0;
for(int j=1; j<=m; ++j) {
s2 = s2*2 + arr[i][j];
}
for(int j=1; j<=m; ++j) {
s3 = s3*2 + arr[i-1][j];
}
for(int j=0; j<=(1<<m)-1; ++j) {
if((j & s2) != j) continue;
if((j & (j<<1)) != 0 || (j & (j>>1)) != 0) {
continue;
}
for(int k=0; k<=(1<<m)-1; ++k) {
if((s3 & k) != k) {
continue;
}
if((k & (k<<1)) != 0 || (k & (k>>1)) != 0) {
continue;
}
if((j & k) != 0) {
continue;
}
dp[i][j] += dp[i-1][k];
}
if(i==n) {
sum += dp[i][j];
}
}
}
cout << sum;
return 0;
}