【洛谷P1879】玉米田Corn Fields

玉米田Corn Fields

题目链接

此题和互不侵犯状压DP的做法类似

f[i][j]表示前i行,第i行种植(1)/不种植(0)构成的二进制数为j时的方案数

首先我们可以预处理出所有一行中没有两个相邻的1的二进制数

然后进行暴力的DP

 #include<cstdio>
#define mod 100000000
#define N 13
#define M 4100
int n,m,f[N][M],a[N];
int s[],cnt,ans;
inline int read(){
char c=getchar();
while(c!=''&&c!='') c=getchar();
return c-'';
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
int x=;
for(int j=m-;j>=;j--)
x+=read()*(<<j);    //处理出该行对应的二进制数
a[i]=x;
}
for(int i=;i<(<<m);i++)
if((i&(i<<))==)     //若没有两个相邻的1
s[++cnt]=i;      //存在数组中
for(int i=;i<=cnt;i++)  //初始化第一行边界
if((s[i]&a[])==s[i])
f[][s[i]]=;
for(int i=;i<=n;i++)
for(int j=;j<=cnt;j++)
if((s[j]&a[i])==s[j])  //若s[j]中的1碰上a[i]中的0,就成了0
for(int k=;k<=cnt;k++)
if((s[k]&s[j])==)
f[i][s[j]]=(f[i][s[j]]+f[i-][s[k]])%mod;
for(int i=;i<=cnt;i++)
ans=(ans+f[n][s[i]])%mod;
printf("%d\n",ans);
return ;
}
上一篇:10年前,我就用 SQL注入漏洞黑了学校网站


下一篇:百度SEO建议