6
int maxScore(vector<int> &nums) {7
memset(dp, -1, sizeof(dp));10
// Build the GCD table11
for (int i = 0; i < sz; ++i) {12
for (int j = i + 1; j < sz; ++j) {13
gcd_table[i][j] = gcd(nums[i], nums[j]);17
// Looping from state 0 to (1<<sz)-119
for (int s = 0; s < (1 << sz); ++s) {20
int cnt = __builtin_popcount(s);21
if (cnt & 1) continue; // bitcount can't be odd22
for (int i = 0; i < sz; ++i) {23
if (s & (1 << i)) continue;24
for (int j = i + 1; j < sz; ++j) {25
if (s & (1 << j)) continue;26
int next_state = s ^ (1 << i) ^ (1 << j);27
dp[next_state] = max(dp[next_state], dp[s] + (cnt / 2 + 1) * gcd_table[i][j]);31
return dp[(1 << sz) - 1];