bzoj1725: [Usaco2006 Nov]Corn Fields牧场的安排(状压dfs)
- 作者: 五速梦信息网
- 时间: 2026年04月04日 13:49
/*
我才不要写状压dp呢!!
状压dfs
对于每一行dfs一次。顺便记录这一行的状态能否对下一行的状态产生贡献。
*/
#include<bits/stdc++.h>
#define N 100000
#define S 30
#define mod 100000000
using namespace std;
int m,n,ans;
int f[S][N],a[S];
inline int read()
{
int x=,f=;char c=getchar();<br/>
while(c>''||c<''){if(c=='-')f=-;c=getchar();}<br/>
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}<br/>
return x*f;<br/>
}
void dfs(int x,int y,int sta,int nxt)//nxt是下行状态
{
if(y>=n)<br/>
{<br/>
f[x+][nxt]+=f[x][sta];<br/>
f[x+][nxt]%=mod;<br/>
return;<br/>
}<br/>
dfs(x,y+,sta,nxt);//不放<br/>
if(!(sta&(<<y))) dfs(x,y+,sta,nxt|(<<y));//保证左右,和下面不相邻<br/>
}
int main()
{
int x;<br/>
m=read();n=read();<br/>
for(int i=;i<=m;i++) for(int j=;j<n;j++)<br/>
{<br/>
x=read();<br/>
if(x==) a[i]=a[i]|(<<j);<br/>
}f[][a[]]=;//初始,第一行,不放,方案数为1
for(int i=;i<=m;i++) for(int j=a[i];j<(<<n);j++)
if(f[i][j]) dfs(i,,j,a[i+]);//如果当前航这个状态合法,就从这个状态dfs<br/>
for(int i=;i<(<<n);i++)<br/>
ans+=f[m+][i],ans%=mod;<br/>
printf("%d\n",ans);<br/>
return ;<br/>
}
- 上一篇: B树——算法导论(25)
- 下一篇: Bzoj1269 [AHOI2006]文本编辑器editor
相关文章
-
B树——算法导论(25)
B树——算法导论(25)
- 互联网
- 2026年04月04日
-
C no implement 宏定义
C no implement 宏定义
- 互联网
- 2026年04月04日
-
c primer应该怎么用
c primer应该怎么用
- 互联网
- 2026年04月04日
-
Bzoj1269 [AHOI2006]文本编辑器editor
Bzoj1269 [AHOI2006]文本编辑器editor
- 互联网
- 2026年04月04日
-
bzoj 3744 Gty的妹子序列 区间逆序对数(在线) 分块
bzoj 3744 Gty的妹子序列 区间逆序对数(在线) 分块
- 互联网
- 2026年04月04日
-
bzoj 2458: [BeiJing2011]最小三角形 题解
bzoj 2458: [BeiJing2011]最小三角形 题解
- 互联网
- 2026年04月04日






