You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
91 lines
2.0 KiB
91 lines
2.0 KiB
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;
|
|
}
|
|
|
|
}
|