Это на самом деле не домашняя работа, а скорее практика и оптимизация, но это казалось лучшим разделом для вопросов такого типа.
Это проблема динамического программирования, и она следующая:
-Дать массив unsorted из N элементов, выбрать из него число элементов K, чтобы их абсолютная разница была наибольшей.
Абсолютная разница вычисляется между соседнимиэлементы здесь. Поэтому, если у нас есть массив из 5 элементов: 1 5 3 2 1 и k = 3, абсолютные различия будут:
1 5 3 = | 5-1 |+ | 3-5 |= 6
1 5 2 = | 5-1 |+ | 2-5 |= 7
1 5 1 = [5-1 |+ | 1-5 |= 8
и т. Д.
С 1 5 1, являющимся самым большим и необходимым с 8
То, что я пробовал до сих пор, - это решить эту проблему путем нахождения всех возможных комбинаций Kчисла с рекурсией и последующим возвратом наибольшего (грубая сила).
Это показалось ужасной идеей, потому что при попытке с массивом N = 50 и k = 25, например, 1,264106064E + 14комбинации.
Рекурсия, которую я использовал, является простой, используемой для печати всех K-значных целых чисел из массива, вместо того, чтобы печатать их, сохраняя их в массиве:
static void solve(int[] numbers, int k, int startPosition, int[] result) {
if (k == 0) {
System.out.println(absoluteDifferenceSum(result));
return;
}
for (int i = startPosition; i <= numbers.length - k; i++) {
result[result.length - k] = numbers[i];
solve(numbers, k - 1, i + 1, result);
}
}
ЧтоЯ хочу достичь оптимальной сложности (которая, я полагаю, не может быть ниже O (n ^ 2) здесь, но у меня нет идей, и я не знаю, как начать. Любая помощь приветствуется!