Problem Link

Description


You are given nums, an array of positive integers of size 2 * n. You must perform n operations on this array.

In the ith operation (1-indexed), you will:

  • Choose two elements, x and y.
  • Receive a score of i * gcd(x, y).
  • Remove x and y from nums.

Return the maximum score you can receive after performing n operations.

The function gcd(x, y) is the greatest common divisor of x and y.

Β 

Example 1:

Input: nums = [1,2]
Output: 1
Explanation:Β The optimal choice of operations is:
(1 * gcd(1, 2)) = 1

Example 2:

Input: nums = [3,4,6,8]
Output: 11
Explanation:Β The optimal choice of operations is:
(1 * gcd(3, 6)) + (2 * gcd(4, 8)) = 3 + 8 = 11

Example 3:

Input: nums = [1,2,3,4,5,6]
Output: 14
Explanation:Β The optimal choice of operations is:
(1 * gcd(1, 5)) + (2 * gcd(2, 4)) + (3 * gcd(3, 6)) = 1 + 4 + 9 = 14

Β 

Constraints:

  • 1 <= n <= 7
  • nums.length == 2 * n
  • 1 <= nums[i] <= 106

Solution


Python3

class Solution:
    def maxScore(self, nums: List[int]) -> int:
        N = len(nums)
        full_mask = (1 << N) - 1
 
        @cache
        def go(index, mask):
            if index == N // 2 + 1: return 0
 
            res = 0
 
            for i in range(N):
                if mask & (1 << i) > 0: continue
                for j in range(i + 1, N):
                    if mask & (1 << j) > 0: continue
 
                    newMask = mask | (1 << i) | (1 << j)
 
                    res = max(res, index * gcd(nums[i], nums[j]) + go(index + 1, newMask))
            
            return res
        
        return go(1, 0)