状压DP。
设状态(f_{i,S})表示考虑最后一个奶牛是原序列中第i个,现在选的奶牛的集合为S,即可凭此转移。
#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
using namespace std;
long long n,k,a[20],ans,f[20][1<<16];
int main() {
cin>>n>>k;
for(int i=1; i<=n; i++) cin>>a[i],f[i][1<<i-1]=1;
for(int l=0; l<1<<n; l++)
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++) {
if(abs(a[i]-a[j])<=k) continue;
if(!(l&(1<<i-1))||(l&(1<<j-1))) continue;
f[j][l|(1<<j-1)]+=f[i][l];
}
}
for(int i=1; i<=n; i++) {
ans+=f[i][(1<<n)-1];
}
cout<<ans;
}