【ルーグ1879】トウモロコシ畑
4537 ワード
問題を作るのがおっくうだよ.そうだ、この問題は2倍の経験がある.
装圧DPはビット演算を利用して隣の問題を簡単に解決することができますが、実は私のは複雑すぎて具体的には、もっと良いビット演算の書き方はYLの大物を参考にすることができますが、私も彼のコードができません.彼は強すぎるからです.しかし、彼のブログはもっと止まった...
問題解
装圧DPはビット演算を利用して隣の問題を簡単に解決することができますが、実は私のは複雑すぎて具体的には、もっと良いビット演算の書き方はYLの大物を参考にすることができますが、私も彼のコードができません.彼は強すぎるからです.しかし、彼のブログはもっと止まった...
#include
#include
#include
#include
#include
#include
using namespace std;
#define MOD 100000000
#define INF 100000000
inline int read()
{
register int x=0,t=1;
register char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-'){t=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*t;
}
int f[15][1<<13];
int n,m,g[15];
bool check(int x)
{
for(int i=1;iif(x&(1<1<1)))return false;
return true;
}
int main()
{
m=read();n=read();
for(int i=1;i<=m;++i)
for(int j=1;j<=n;++j)
g[j]|=(read())<1);
f[0][0]=1;
for(int i=1;i<=n;++i)
{
for(int j=0;j1<if((j&g[i-1])!=j)continue;
if(!check(j))continue;
for(int k=0;k1<if(k&j)continue;
if((k&g[i])!=k)continue;
if(!check(k))continue;
f[i][k]=(f[i][k]+f[i-1][j])%MOD;
}
}
}
int ans=0;
for(int i=0;i1<printf("%d
",ans);
return 0;
}