leetcode 1799 N次操作後的最大分數和
阿新 • • 發佈:2022-02-04
回溯會超時,狀態壓縮
class Solution { public int maxScore(int[] nums) { int len = nums.length; int size = 1 << len; int[] dp = new int[size]; int[][] g = new int[len][len]; for (int i = 0; i < len; i++) { for (int j = i + 1; j < len; j++) { g[i][j]= g[j][i] = gcd(nums[i], nums[j]); } } for (int x = 0; x < size; x++) { int c = Integer.bitCount(x); if (c % 2 == 1) { continue; } for (int j = 0; j < len; j++) { for (int k = j + 1; k < len; k++) {if ((x & (1 << j)) > 0 && (x & (1 << k)) > 0) { int tmp = x - (1<<j) - (1<<k); dp[x] = Math.max(dp[x], dp[tmp]+ c/2 *g[j][k]); } } } }return dp[size-1]; } public int gcd(int a, int b) { if (b == 0) { return a; } return gcd(b, a % b); } }