2
public int maxScore(int[] nums) {4
Map<Integer, Integer> gcdVal = new HashMap<>();5
for (int i = 0; i < n; ++i) {6
for (int j = i + 1; j < n; ++j) {7
gcdVal.put((1 << i) + (1 << j), gcd(nums[i], nums[j]));11
int[] dp = new int[1 << n];13
for (int i = 0; i < (1 << n); ++i) {14
int bits = Integer.bitCount(i); // how many numbers are used15
if (bits % 2 != 0) // odd numbers, skip it17
for (int k : gcdVal.keySet()) {18
if ((k & i) != 0) // overlapping used numbers20
dp[i ^ k] = Math.max(dp[i ^ k], dp[i] + gcdVal.get(k) * (bits / 2 + 1));24
return dp[(1 << n) - 1];27
public int gcd(int a, int b) {