У меня есть 2 проблемы, которые вытекают из простой проблемы. Я объясню простой с решением, которое я нашел, и после этого измененную проблему.
Предположим, что есть игра с 2 игроками, А и В, и список
целые положительные числа. Игрок А начинает с того, что вынимает число из списка, игрок
B делает то же самое и так далее, после того, как больше нет чисел в
список. Оба игрока суммируют выбранные цифры. Цель
для каждого игрока, чтобы максимизировать разницу между его суммой и
сумма противника, которая является счетом. Вопрос в том, что является
максимальное количество очков игрок может получить, если оба игрока играют в оптимальном
образом.
Теперь для этого я выяснил, что оптимальная стратегия для каждого игрока - брать наибольшее число на каждом шаге, псевдокод следующий:
sumA = 0
sumB = 0
list = [1, 5, 3, 7, 9]
while list IS NOT EMPTY:
val = pop_max(list)
sumA = sumA + val
if list IS NOT EMPTY:
val = pop_max(list)
sumB = sumB + val
scoreA = sumA - sumB
print scoreA
Это может выполняться в O (n) или O (n * log (n)) в зависимости от того, как отсортированы числа из списка.
Следующие 2 модификации:
В начале игры игрок A должен удалить K чисел из списка. Если он делает это оптимальным образом и после этого игры являются начальными, какую максимальную оценку он может получить?
и
На каждом шаге игроки могут выбрать самый левый или самый правый номер из списка. Снова они играют оптимальным образом. Какой максимальный балл может получить игрок А?
Для второй модификации я могу придумать подход грубой силы, то есть вычисление дерева всех возможностей, но это не работает для больших входных данных. Я считаю, что есть какой-то алгоритм DP.
Для первой модификации я не могу придумать идею.
Может кто-нибудь помочь с некоторыми идеями алгоритма для 2 модификаций?
[LATTER EDIT]
Решение для 2-й модификации можно найти здесь https://www.geeksforgeeks.org/optimal-strategy-for-a-game-dp-31/ Это DP.