1. 程式人生 > 其它 >leetcode 1799 N次操作後的最大分數和

leetcode 1799 N次操作後的最大分數和

回溯會超時,狀態壓縮

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); } }