您的位置:首页 > 其它

bzoj1231[Usaco2008 Nov]mixup2 混乱的奶牛

2015-09-24 13:55 405 查看
状压dp

#include<stdio.h>
#include<algorithm>
using namespace std;
typedef long long ll;
ll n,m;
ll a[20];
ll f[20][1<<16];
int main()
{
scanf("%lld %lld",&n,&m);
for(ll i=0;i<n;i++)
{
scanf("%lld",&a[i]);
}
for(ll i=0;i<n;i++)
{
f[i][1<<i]=1;//以a[i]为开头
}
for(ll j=0;j<(1<<n);j++)
{
for(ll i=0;i<n;i++)
{
if(j&(1<<i))//a[i]要在这个集合里
{
for(ll k=0;k<n;k++)
{
if(!((1<<k)&j)&&abs(a[i]-a[k])>m)//a[k]不在这个集合里
{
f[k][j|(1<<k)]+=f[i][j];
}
}
}
}
}
ll ans=0;
for(ll i=0;i<n;i++)
{
ans+=f[i][(1<<n)-1];
}
printf("%lld",ans);
}


用01存的是第i个数有没有在里面,而不是这个数值。&判断是否在里面,在为1。| (或)用来添加。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息