|
| 1 | +#include <stdio.h> |
| 2 | +#include <stdlib.h> |
| 3 | +#include <stdbool.h> |
| 4 | + |
| 5 | +int greatestCommonDivisor(int a, int b) { |
| 6 | + while (b != 0) { |
| 7 | + int temp = b; |
| 8 | + b = a % b; |
| 9 | + a = temp; |
| 10 | + } |
| 11 | + return a; |
| 12 | +} |
| 13 | + |
| 14 | +int max(int a, int b) { |
| 15 | + return (a > b) ? a : b; |
| 16 | +} |
| 17 | + |
| 18 | +int func(int* nums, int op, int mask, int* dp, int** gcdValues, int m) { |
| 19 | + int n = m / 2; |
| 20 | + if (op > n) return 0; |
| 21 | + if (dp[mask] != -1) return dp[mask]; |
| 22 | + |
| 23 | + for (int i = 0; i < m; i++) { |
| 24 | + if ((mask & (1 << i))) continue; |
| 25 | + for (int j = i + 1; j < m; j++) { |
| 26 | + if ((mask & (1 << j))) continue; |
| 27 | + |
| 28 | + int newMask = (1 << i) | (1 << j) | mask; |
| 29 | + int score = op * gcdValues[i][j] + func(nums, op + 1, newMask, dp, gcdValues, m); |
| 30 | + dp[mask] = max(dp[mask], score); |
| 31 | + } |
| 32 | + } |
| 33 | + return dp[mask]; |
| 34 | +} |
| 35 | + |
| 36 | +int maxScore(int* nums, int numsSize) { |
| 37 | + int m = numsSize, n = numsSize / 2; |
| 38 | + int** gcdValues = (int**)malloc(m * sizeof(int*)); |
| 39 | + for (int i = 0; i < m; i++) { |
| 40 | + gcdValues[i] = (int*)malloc(m * sizeof(int)); |
| 41 | + } |
| 42 | + |
| 43 | + for (int i = 0; i < m; i++) { |
| 44 | + for (int j = 0; j < m; j++) { |
| 45 | + gcdValues[i][j] = greatestCommonDivisor(nums[i], nums[j]); |
| 46 | + } |
| 47 | + } |
| 48 | + |
| 49 | + int* dp = (int*)malloc((1 << 14) * sizeof(int)); |
| 50 | + for (int i = 0; i < (1 << 14); i++) { |
| 51 | + dp[i] = -1; |
| 52 | + } |
| 53 | + |
| 54 | + int result = func(nums, 1, 0, dp, gcdValues, m); |
| 55 | + |
| 56 | + for (int i = 0; i < m; i++) { |
| 57 | + free(gcdValues[i]); |
| 58 | + } |
| 59 | + free(gcdValues); |
| 60 | + free(dp); |
| 61 | + |
| 62 | + return result; |
| 63 | +} |
0 commit comments