状态压缩
状态压缩指的是用较小的数据结构(如整数或位掩码)来表示一个可能的状态或组合,从而减少存储空间和计算复杂性
- 当两个数据分析特别大的时候,我们可以考虑使用二进制来实现的分类;
- 下面举例使一个数组的分为 a b两组,找到 max( , ) 中的最小值
- a 代表一个分类 b 代表一个分类
cin >> n;
for(int i = 0; i < n; i ++) cin >> k[i];
for(LL state = 0; state < 1LL << n; state ++){ ---> A
a = 0, b = 0;
for(int i = 0; i < n; i ++){ ---> B
if(state >> i & 1) a += k[i];
else b += k[i];
}
ans = min(ans, max(a, b)); ---> C
- state表示了一个被压缩的状态 用long long 表示一个被分类的状态
Note
A:实际上是表示了种状态 1LL << n 等效于
B:二进制位一共有n位,i 从零到 n 解 state二进制位
- 对于每个元素
k[i]
,根据state
的二进制位判断该元素属于组a
还是组b
C: 刷新ans,这确保了
ans
始终存储的是所有分组方式中最小的最大和例子解释,当 n = 3 时
每个
state
的二进制位表示每个元素属于哪一组。例如,对于n = 3
(有 3 个元素的情况):
state = 0
(000):所有元素都在组b
state = 1
(001):第一个元素在组a
,其余元素在组b
state = 2
(010):第二个元素在组a
,其余在组b
state = 3
(011):第一个和第二个元素在组a
,第三个在组b
- …
state = 7
(111):所有元素都在组a
Tip
状态压缩的复杂度为 在 时大概率TLE