DPU Grouping

cxqghzj·2023-11-23 09:31·4 次阅读

DPU Grouping

题意#

给定 n 个物品,任意分组,ij 物品在同一组贡献为 ai,j

求最大贡献。n16

Sol#

考虑状压 fi 表示 i 集合的最大贡献。

注意到枚举最后一个选的数不好转移,考虑用一个集合转移到另一个集合。

子集枚举即可。

复杂度 3n

Code#

Copy
#include <iostream> #include <algorithm> #include <cstdio> #include <array> #define int long long using namespace std; #ifdef ONLINE_JUDGE #define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++) char buf[1 << 23], *p1 = buf, *p2 = buf, ubuf[1 << 23], *u = ubuf; #endif int read() { int p = 0, flg = 1; char c = getchar(); while (c < '0' || c > '9') { if (c == '-') flg = -1; c = getchar(); } while (c >= '0' && c <= '9') { p = p * 10 + c - '0'; c = getchar(); } return p * flg; } void write(int x) { if (x < 0) { x = -x; putchar('-'); } if (x > 9) { write(x / 10); } putchar(x % 10 + '0'); } const int N = 21, M = 1e6 + 5; array <array <int, N>, N> G; array <int, M> f, g; signed main() { int n = read(); for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) G[i][j] = read(); for (int T = 0; T < 1 << n; T++) { for (int i = 1; i <= n; i++) { for (int j = 1; j <= i; j++) { if (!(T & (1 << (i - 1))) || !(T & (1 << (j - 1)))) continue; g[T] += G[i][j]; } } } for (int T = 0; T < 1 << n; T++) { f[T] = g[T]; for (int P = (T - 1) & T; P; P = (P - 1) & T) f[T] = max(f[T], f[T ^ P] + f[P]); } write(f[(1 << n) - 1]), puts(""); return 0; }
posted @   cxqghzj  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示
目录