BZOJ1231【状压DP】

来源:互联网 发布:党员队伍结构持续优化 编辑:程序博客网 时间:2024/06/06 01:15
/* I will wait for you*/#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <ctime>#include <algorithm>#include <iostream>#include <fstream>#include <vector>#include <queue>#include <deque>#include <map>#include <set>#include <string>#define make make_pair#define fi first#define se secondusing namespace std;typedef long long ll;typedef unsigned long long ull;typedef pair<int,int> pii;const int maxn = 100010;const int maxm = 20;const int maxs = 26;const int inf = 0x3f3f3f3f;const int P = 1000000007;const double error = 1e-9;inline int read(){int x = 0, f = 1;char ch = getchar();while (ch <= 47 || ch >= 58)f = (ch == 45 ? -1 : 1), ch = getchar();while (ch >= 48 && ch <= 57)x = x * 10 + ch - 48, ch = getchar();return x * f;}int n, d, hi[maxn], bi[maxn];ll f[maxn][maxm], ans;int main(){n = read(), d = read();for (int i = 1; i <= n; i++)hi[i] = read();for (int i =1 ; i <= n; i++)bi[i] = 1 << (i - 1);for (int i = 1; i <= n; i++)f[bi[i]][i] = 1;for (int i = 1; i < (1 << n); i++)for (int j = 1; j <= n; j++)if(bi[j] & i)for (int k = 1; k <= n; k++) if((bi[k] | i) != i && abs(hi[j] - hi[k]) > d)f[bi[k] | i][k] += f[i][j];for (int i = 1; i <= n; i++)ans += f[(1 << n) - 1][i];printf("%lld\n", ans);return 0;}

0 0
原创粉丝点击