E - Ac Challenge 【18南京網路賽】
阿新 • • 發佈:2020-12-02
E - Ac Challenge
一個比較簡單的 狀壓dp
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N = 21; ll f[1 << N], a[N], b[N]; vector<int>G[N]; int n, m; bool judge(int state, int pos) { // 判斷state狀態加入pos是否河裡 if (f[state] == -1 or (state & (1 << pos))) return false; for (int v : G[pos]) { if (not (state & (1 << v)))return false; } return true; } int count(int x) { int ans = 0; while (x)ans++, x -= (-x) & x; return ans; } int main() { scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%lld%lld%d", a + i, b + i, &m); while (m--) { int x; scanf("%d", &x); G[i].push_back(x-1); } } ll ans = 0; memset(f, 0xff, sizeof f); f[0] = 0; for (int i = 0; i < 1 << n; i++) { for (int j = 0; j < n; j++) { if (not judge(i, j))continue; f[i | (1 << j)] = max(f[i | (1 << j)], f[i] + (1 + count(i)) * a[j] + b[j]); ans = max(ans, f[i | (1 << j)]); } } printf("%lld\n", ans); }