Skip to content

Commit d8a4758

Browse files
authored
Merge pull request #2949 from mdmzfzl/main
Create: 1799-maximize-score-after-n-operations.c
2 parents 2007d43 + 38c3e24 commit d8a4758

File tree

1 file changed

+63
-0
lines changed

1 file changed

+63
-0
lines changed

Diff for: c/1799-maximize-score-after-n-operations.c

+63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
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

Comments
 (0)