package class_2022_03_5_week; import java.util.Arrays; // 测试链接 : https://leetcode.com/problems/maximum-and-sum-of-array/ public class Code03_MaximumAndSumOfArray { public static int maximumANDSum(int[] arr, int m) { m <<= 1; int[][] graph = new int[m][m]; for (int i = 0; i < arr.length; i++) { for (int j = 0, num = 1; j < m; num++, j += 2) { graph[i][j] = arr[i] & num; graph[i][j + 1] = arr[i] & num; } } return km(graph); } public static int km(int[][] graph) { int N = graph.length; int[] match = new int[N]; int[] lx = new int[N]; int[] ly = new int[N]; boolean[] x = new boolean[N]; boolean[] y = new boolean[N]; int[] slack = new int[N]; int invalid = Integer.MAX_VALUE; for (int i = 0; i < N; i++) { match[i] = -1; lx[i] = -invalid; for (int j = 0; j < N; j++) { lx[i] = Math.max(lx[i], graph[i][j]); } ly[i] = 0; } for (int from = 0; from < N; from++) { for (int i = 0; i < N; i++) { slack[i] = invalid; } Arrays.fill(x, false); Arrays.fill(y, false); while (!dfs(from, x, y, lx, ly, match, slack, graph)) { int d = invalid; for (int i = 0; i < N; i++) { if (!y[i] && slack[i] < d) { d = slack[i]; } } for (int i = 0; i < N; i++) { if (x[i]) { lx[i] = lx[i] - d; } if (y[i]) { ly[i] = ly[i] + d; } } Arrays.fill(x, false); Arrays.fill(y, false); } } int ans = 0; for (int i = 0; i < N; i++) { ans += (lx[i] + ly[i]); } return ans; } public static boolean dfs(int from, boolean[] x, boolean[] y, int[] lx, int[] ly, int[] match, int[] slack, int[][] map) { int N = map.length; x[from] = true; for (int to = 0; to < N; to++) { if (!y[to]) { int d = lx[from] + ly[to] - map[from][to]; if (d != 0) { slack[to] = Math.min(slack[to], d); } else { y[to] = true; if (match[to] == -1 || dfs(match[to], x, y, lx, ly, match, slack, map)) { match[to] = from; return true; } } } } return false; } }