Мне было предложено дать динамический алгоритм , который будет принимать последовательность четного количества чисел (как положительных, так и отрицательных) и выполнить следующие:Динамический алгоритм для нахождения максимальной суммы продуктов «доступных» чисел в массиве
Каждый «поворот» двух чисел выбирается для умножения. Алгоритм может получить доступ только к концу последовательности. Однако, если выбранный номер первым номером является самым левым номером, то номер второй может быть либо самым правым числом, либо новым самым левым номером (поскольку старое левое число уже было «удалено/выбрано») и наоборот , Цель программы - найти максимум всего продуктов двух чисел, выбранных в каждом раунде.
Пример:
Последовательность: {10, 4, 20, -5, 0, 7}
оптимальный результат: 7 * 10 + 0 * -5 + 4 * 20 =
Мой прогресс:
Я пытаюсь найти динамический подход без большой удачи. Я смог вывести, что программе по существу разрешено умножать конечные числа на «смежные» числа каждый раз и что целью является умножение наименьших возможных чисел на наименьшие возможные числа (в результате получается либо двойной отрицательное умножение - положительное число или наименьшее возможное число) и продолжать применять это правило каждый раз до самого конца. В противоположность этому, это правило также применяется в противоположном направлении - умножать максимально возможные числа на максимально возможные числа каждый раз. Может быть, лучший способ - применить оба метода сразу? Я не уверен, как я уже упоминал, мне не удавалось реализовать алгоритм для этой проблемы.
Написание рекурсивного алгоритма для проверки каждой возможности довольно просто; однако это будет проверять одни и те же последовательности много раз: в вашем примере есть три разных способа прийти к последнему шагу {20, -5}. Чтобы избежать вычисления этого три раза, вы сначала вычислите результат для коротких субмассив, сохраните результат и затем используйте его для решения больших частей массива. – m69
Для массива из 20 чисел для простого рекурсивного алгоритма требуется 29,524 рекурсии, тогда как алгоритм, который создается из меньших частей в более крупные части (также см. Ответ dfb), должен вычислять только 100 случаев (19 + 17 + ... + 1). – m69