Задача состоит в том, чтобы выбрать наилучший вариант в каждый момент игры по следующим правилам:
Вы можете выбрать только крайнюю левую или крайнюю правую карту.
Ваш противник ВСЕГДА выберет первым и ВСЕГДА выберет самую старшую карту из самой левой или самой правой карты. Если это галстук, он выберет самый правый. Учтите, что это не всегда лучший выбор.
Иногда выиграть невозможно, но вы все равно должны показать максимальную сумму, которую вы можете добавить, играя против этого противника (или стратегии, скажем).
Пример:
Cards: 1 2 4 2 8 4 3
Opponent: 3 4 2 2 = 11
Me: 1 8 4 = 13
Здесь я выбрал 1 вместо 4 на втором ходу, чтобы я мог выбрать 8 позже. Вот почему выбирать старшую карту не всегда лучше.
Я пытался реализовать это решение с помощью рекурсии, но я не уверен, что это лучший вариант. Любые идеи о том, как разработать этот алгоритм?
[EDIT] Спасибо @PengOne за щедрую помощь. Это код, который я пытаюсь реализовать, но, к сожалению, он дает мне ошибки. Что мне в нем исправить? Я редактирую это по мере продвижения.
static int cardGameValue(List<int> D, int myScore, int opponentScore)
{
if (D.Count == 0) return myScore;
else
{
if (D[0] <= D[D.Count - 1])
{
opponentScore += D[D.Count - 1];
D.RemoveAt(D.Count - 1);
}
else
{
opponentScore += D[0];
D.RemoveAt(0);
}
int left = cardGameValue(
new List<int>(D.GetRange(1, D.Count - 1)),
myScore + D[0],
opponentScore);
int right = cardGameValue(
new List<int>(D.Take(D.Count - 2)),
myScore + D[D.Count - 1],
opponentScore);
if (left >= right)
{ return left; }
else
{ return right; }
}
}