Untitled
unknown
java
2 years ago
2.4 kB
10
Indexable
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class UnequalElements2 {
private int n;
private int[][] dp;
private int[] nextSame;
private int[][] data;
private static class Pair {
int value;
int count;
Pair(int value, int count) {
this.value = value;
this.count = count;
}
}
private void processData(int[] arr) {
List<Pair> dataList = new ArrayList<>();
int st = 0;
for (int i = 1; i < arr.length; i++) {
if (arr[i] != arr[i - 1]) {
dataList.add(new Pair(arr[i - 1], i - st));
st = i;
}
}
dataList.add(new Pair(arr[arr.length - 1], arr.length - st));
// Convert the List<Pair> to an array
data = new int[dataList.size()][2];
for (int i = 0; i < dataList.size(); i++) {
data[i][0] = dataList.get(i).value;
data[i][1] = dataList.get(i).count;
}
// Calculate the next occurrence
n = data.length;
nextSame = new int[n];
Map<Integer, Integer> seen = new HashMap<>();
for (int i = n - 1; i >= 0; i--) {
int value = data[i][0];
nextSame[i] = seen.getOrDefault(value, n);
seen.put(value, i);
}
}
private int recursion(int i, int k) {
if (k < 0) return 0;
if (i == n) return 0;
if (dp[i][k] != -1) return dp[i][k];
// Choose the current element
int ans = Math.max(recursion(i + 1, k - 1), recursion(nextSame[i], k)) + data[i][1];
// Not choosing the current element
ans = Math.max(ans, recursion(i + 1, k));
dp[i][k] = ans;
return ans;
}
public void solve(int[] arr, int k) {
processData(arr);
dp = new int[n][k + 1];
for (int i = 0; i < n; i++) {
for (int j = 0; j <= k; j++) {
dp[i][j] = -1;
}
}
System.out.println("ans2 " + recursion(0, k));
}
public static void main(String[] args) {
int[] arr = {1, 1, 2, 3, 2, 2, 1, 1};
int k = 2;
UnequalElements2 app = new UnequalElements2();
app.solve(arr, k);
}
}
Editor is loading...
Leave a Comment