MIXUP2 - Đàn bò hỗn loạn

Tác giả: happyboy99x

Ngôn ngữ: C++

#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;

#define TR(v,i) for(typeof((v).begin())i=(v).begin();i!=(v).end();++i)

#define N 16
int a[N], n, k;
long long f[1<<N][N];
vector<int> suit[N];

void enter() {
	scanf("%d%d",&n,&k);
	for(int i = 0; i < n; ++i) scanf("%d", a+i);
}

long long F(int state, int x) {
	long long & res = f[state][x];
	if(res != -1) return res;
	if(state == 0) return res = 1; 
	res = 0;
	TR(suit[x], it) {
		int t = *it;
		if(state & 1 << t) res += F(state & ~(1 << t), t);
	}
	return res;
}

void solve() {
	for(int i = 0; i < n; ++i)
		for(int j = 0; j < n; ++j)
			if(abs(a[i] - a[j]) > k) suit[i].push_back(j);
	memset(f, -1, sizeof f);
	long long res = 0;
	for(int i = 0; i < n; ++i)
		res += F((1 << n) - 1 & ~(1 << i), i);
	printf("%lld\n", res);
}

int main() {
	enter();
	solve();
	return 0;
}

Download