简单的状压dp,用的是按格递推的方式,这样写要比较简单高效一些。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=13,mod=100000000;
int dp[2][8200];
inline void add(int &a,int &b)
{
a+=b;
a%=mod;
}
int main()
{
// freopen("in.txt","r",stdin);
int n,m;
while(scanf("%d %d",&n,&m)!=EOF)
{
int now=1,to=0;
dp[0][0]=1;
for(int i=1,tmp,key;i<=n;i++)
for(int j=1;j<=m;j++)
{
now=now^1,to=to^1;
memset(dp[to],0,sizeof(dp[to]));
scanf("%d",&tmp);
for(int k=0;k<(1<<m+1);k++)
{
key=k;
if(key&1) key-=1;
if(key&(1<<j)) key-=(1<<j);
add(dp[to][key],dp[now][k]);
if(tmp==1)
if((k&(1<<j))==0)
if((k&1)==0)
{
key=k|1|(1<<j);
if(j==m)
key-=1;
add(dp[to][key],dp[now][k]);
}
}
}
int ans=0;
for(int i=0;i<(1<<m+1);i++)
add(ans,dp[to][i]);
cout<<ans<<endl;
}
return 0;
}
本文介绍了一种使用状态压缩动态规划(状压DP)与按位操作结合的方法来解决复杂问题,通过实例展示如何简化代码并提高效率。
816

被折叠的 条评论
为什么被折叠?



