[USACO08NOV]Mixed Up Cows

状压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;
}
我是咸鱼。转载博客请征得博主同意Orz
原文地址:https://www.cnblogs.com/sdfzhsz/p/9325627.html