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

 

posted @ 2022-02-04 21:00  fishcanfly  阅读(55)  评论(1)    收藏  举报
//雪花飘落效果