class Solution { public: int solve(vector<int>& nums, int ops, int mask,vector<int>& dp){ int m = nums.size(), n = (m/2); if(ops > n) return 0; if(dp[mask] != -1) return dp[mask]; for(int i = 0 ; i < m; i++){ if(mask & (1<<i))continue; for(int j = i + 1 ; j < m; j++){ if(mask & (1<<j))continue; int newMask = (1<<i) | (1<<j) | mask; int score = ops*__gcd(nums[i], nums[j]) + solve(nums, ops+1, newMask, dp); dp[mask] = max(dp[mask], score); } } return dp[mask]; } int maxScore(vector<int>& nums) { vector<int> dp(1<<14, -1); return solve(nums, 1, 0, dp); } };