bzoj1231 [Usaco2008 Nov]mixup2 混乱的奶牛——状压DP

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1231

小型状压DP;

f[i][j] 表示状态为 j ,最后一个奶牛是 i 的方案数;

所以下一个只能是和它相差大于 k 而且不在状态中的奶牛。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
int n,m,s[20];
ll ans,f[20][1<<16];
int abss(int x){return (x>0)?x:-x;}
int main()
{
    scanf("%d%d",&n,&m);
    int mx=(1<<n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&s[i]);
        f[i][1<<(i-1)]=1;
    }
    for(int i=0;i<mx;i++)
        for(int j=1;j<=n;j++)
        {
            if(!((1<<(j-1))&i))continue;
            for(int k=1;k<=n;k++)
            {
                if((1<<(k-1))&i)continue;
                if(abss(s[k]-s[j])>m)f[k][i|(1<<(k-1))]+=f[j][i];
            }
        }
    for(int i=1;i<=n;i++)ans+=f[i][mx-1];
    printf("%lld\n",ans);
    return 0;
}

 

posted @ 2018-07-17 19:42  Zinn  阅读(175)  评论(0编辑  收藏  举报