-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathwk404.java
124 lines (104 loc) · 3.12 KB
/
wk404.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package weekly;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class wk404 {
public int maxHeightOfTriangle(int red, int blue) {
return Math.max(help(red, blue), help(blue, red));
}
int help(int a, int b) {
int i = 1;
while (true) {
if (i % 2 == 1) {
a -= i;
} else {
b -= i;
}
if (a < 0 || b < 0) return i - 1;
i++;
}
}
static public int maximumLength(int[] nums) {
int pre0 = -1, pre1 = -1;
int[][] dp = new int[nums.length][2];
int res = 0;
for (int i = 0; i < nums.length; i++) {
int d = nums[i] % 2;
if (d == 0) {
dp[i][0] = pre0 == -1 ? 1 : dp[pre0][0] + 1;
dp[i][1] = pre1 == -1 ? 1 : dp[pre1][1] + 1;
pre0 = i;
} else if (d == 1) {
dp[i][0] = pre1 == -1 ? 1 : dp[pre1][0] + 1;
dp[i][1] = pre0 == -1 ? 1 : dp[pre0][1] + 1;
pre1 = i;
}
res = Math.max(res, Math.max(dp[i][0], dp[i][1]));
}
return res;
}
// dp
/* public int maximumLength(int[] nums, int k) {
int[] pre = new int[k];
Arrays.fill(pre, -1);
int[][] dp = new int[nums.length][k];
int res = 0;
for (int i = 0; i < nums.length; i++) {
int d = nums[i] % k;
for (int j = 0; j < k; j++) {
int p = (k - d - j+k) % k;
dp[i][j] = pre[p] == -1 ? 1 : dp[pre[p]][j] + 1;
res = Math.max(res, dp[i][j]);
}
pre[d] = i;
}
return res;
}*/
// 利用同余性质dp
public int maximumLength(int[] nums, int k) {
int ans = 0;
int[][] f = new int[k][k];
for (int x : nums) {
x %= k;
for (int y = 0; y < k; y++) {
f[y][x] = f[x][y] + 1;
ans = Math.max(ans, f[y][x]);
}
}
return ans;
}
// 树直径的性质
public int minimumDiameterAfterMerge(int[][] edges1, int[][] edges2) {
int d1 = diameter(edges1);
int d2 = diameter(edges2);
return Math.max(Math.max(d1, d2), (d1 + 1) / 2 + (d2 + 1) / 2 + 1);
}
private int res;
private int diameter(int[][] edges) {
List<Integer>[] g = new ArrayList[edges.length + 1];
Arrays.setAll(g, i -> new ArrayList<>());
for (int[] e : edges) {
int x = e[0];
int y = e[1];
g[x].add(y);
g[y].add(x);
}
res = 0;
dfs(0, -1, g);
return res;
}
private int dfs(int x, int fa, List<Integer>[] g) {
int maxLen = 0;
for (int y : g[x]) {
if (y != fa) {
int subLen = dfs(y, x, g) + 1;
res = Math.max(res, maxLen + subLen);
maxLen = Math.max(maxLen, subLen);
}
}
return maxLen;
}
public static void main(String[] args) {
maximumLength(new int[]{1, 3});
}
}