题目:一个n维的单位立方体,每个顶点上有一个权值,顶点的power为它的相邻顶点的权值和,
求两个相邻定点的power的和的最大值。
分析:位运算。利用异或运算,求相邻节点求解。
n维的单位立方体,可以用二进制数来描述,每个位代表一个维度,二进制数对应向量;
相邻的节点,只有一个坐标是不同的,所以枚举所有位异或,可以得到所有相邻顶点;
通过上面的运算可以求解每个顶点的power,所有节点枚举单个相邻节点计算最大值。
说明:题目有点绕,O(∩_∩)O~。
#include <stdio.h>
int weight[32768];
int power[32768];
int main()
{
int n;
while (~scanf("%d",&n)) {
int m = 1<<n;
for (int i = 0; i < m; ++ i) {
scanf("%d",&weight[i]);
}
for (int i = 0; i < m; ++ i) {
power[i] = 0;
for (int j = 0; j < n; ++ j) {
power[i] += weight[i^(1<<j)];
}
}
int max = 0;
for (int i = 0; i < m; ++ i) {
for (int j = 0; j < n; ++ j) {
if (max < power[i] + power[i^(1<<j)]) {
max = power[i] + power[i^(1<<j)];
}
}
}
printf("%d\n",max);
}
return 0;
}