[Luogu2915] [USACO08Nov,Gold] Mixed Up Cows [状态压缩][dp]

[ L i n k \frak{Link} ]


如果这道题目的K≤9那就是一道数位dp
不过它的K≤3400N≤16
水状压。

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cctype>
#include<cmath>
#include<ctime>
#include<cstring>
using namespace std;
int n, K, s[25005];
long long F[20][65565];
int limit;
int main() {
	scanf("%d%d", &n, &K);
	for (int i = 1; i <= n; ++i) {
		scanf("%d", &s[i]);
	}
	limit = (1<<n) - 1;
	for (int i = 1; i <= n; ++i) F[i][1<<i-1] = 1;
	for (int i = 1; i < limit; ++i) {
		for (int j = 1; j <= n; ++j) {
			if (!(i&1<<j-1)) continue;
			if (!F[j][i]) continue;
			for (int k = 1; k <= n; ++k) {
				if (i&1<<k-1) continue;
				if (abs(s[k] - s[j]) <= K) continue;
				F[k][i|1<<k-1] += F[j][i];
			}
		}
	}
	long long ans = 0;
	for (int i = 1; i <= n; ++i) ans += F[i][limit];
	printf("%lld", ans);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Estia_/article/details/83542665