前言:
好简单啊...我最近写这种题跟写x x题一样...或许就是x x题吧...
思路:
令f[i][j]表示第i行状态时j的方案数,然后把合法的转移一下,不合法的不转移就好了.至从我码力变好了之后写这种题真的...)
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=13,M=(1<<13);
const int mod=100000000;
int f[N][M];//到了第i行,站人的状态为j的方案数.
int mp[N];
int n,m,x;
bool ck(int u)
{
bool last=false;
for(int i=0;i<m;i++)
{
if(last&&(u>>i&1)) return true;
else if(u>>i&1) last=true;
else last=false;
}return false;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(mp,0,sizeof mp);
memset(f,0,sizeof f);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d",&x);
mp[i]*=2;
mp[i]+=x;
}
}f[0][0]=1;int ans=0;
for(int i=1;i<=n;i++)
{
for(int j=0;j<(1<<m);j++)//枚举这行站人的情况.
{
if(ck(j)||((j|mp[i])!=mp[i])) continue;
for(int k=0;k<(1<<m);k++)//枚举上行站人的情况.
{
if(j&k) continue;
f[i][j]+=f[i-1][k];
f[i][j]%=mod;
}
}
}
for(int i=0;i<(1<<m);i++)
{
ans+=f[n][i];ans%=mod;
}printf("%d\n",ans);
}
return 0;
}
京公网安备 11010502036488号