您的位置:首页 > 其它

POJ 3254 Corn Fields (状压DP入门)

2016-03-15 16:09 399 查看
http://poj.org/problem?id=3254

状压DP:

#include<iostream>
#include<cstring>
using namespace std;

int dp[13][1<<13];
int mp[13],s[1<<13];
int n,m;

int check1(int x)
{
return x&(x<<1);
}

int check2(int x,int p)
{
return mp[x]&p;
}

int main()
{
cin>>n>>m;
memset(dp,0,sizeof(dp));
memset(mp,0,sizeof(mp));
memset(s,0,sizeof(s));
for (int i=1;i<=n;i++)
{
for (int j=1;j<=m;j++)
{
int x;
cin>>x;
if (x==0) mp[i]+=1<<(j-1);
}
}
int cut=0;
for (int i=0;i<(1<<m);i++)
{
if (!check1(i)) s[cut++]=i;
}
for (int i=1;i<=n;i++)
{
for (int j=0;j<cut;j++)
{
if (check2(i,s[j])) continue;
if (i==1)
{
dp[1][j]=1;
continue;
}
for (int k=0;k<cut;k++)
{
if (s[j]&s[k]) continue;
dp[i][j]+=dp[i-1][k];
}
}
}
int ans=0;
for (int i=0;i<cut;i++)
{
ans=(ans+dp
[i])%100000000;
}
cout<<ans<<endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: