不会状态压缩DP,看着大神的题解撸了一遍,算是懵懵懂懂
画了个不完整的流程图
然后上代码吧
#include<iostream>
#include<memory.h>
using namespace std;
const int N = 13;
const int M = 1<<N;
const int MOD = 100000000;
int flag[M],map[M];
int dp[N][M];
bool judgeOne(int x)
{
return (x&(x<<1));
}
bool judgeTwo(int One,int Two)
{
return(flag[One]&map[Two]);
}
int main()
{
int row,column,x;
while(cin>>row>>column){
memset(flag,0,sizeof(flag));
memset(map,0,sizeof(map));
memset(dp,0,sizeof(dp));
for(int i=1;i<=row;i++)
{
for(int j=1;j<=column;j++)
{
cin>>x;
if(x==0){
map[i]+=(1<<(j-1));
}
}
}
int num=0;
for(int i=0;i<(1<<column);i++)
{
if(!judgeOne(i)){
flag[num++] = i;
}
}
for(int i=0;i<num;i++)
{
if(!judgeTwo(i,1)){
dp[1][i] = 1;
}
}
for(int i=2;i<=row;i++)
{
for(int j=0;j<num;j++)
{
if(judgeTwo(j,i)){
continue;
}
for(int z=0;z<num;z++)
{
if(judgeTwo(z,i-1)){
continue;
}
if(!(flag[j]&flag[z])){
dp[i][j]+=dp[i-1][z];
}
}
}
}
int ans = 0;
for(int i=0;i<num;i++)
{
ans+=dp[row][i];
ans%=MOD;
}
cout<<ans<<endl;
}
return 0;
}