Проблема заключается в выборе лучшего варианта в каждый момент игры, следуя этим правилам:
Вы можете выбрать только самую левую или самую правую карту.
Ваш оппонент ВСЕГДА выбирает первым и ВСЕГДА выбирает старшую карту из крайней левой или правой карты. Если это галстук, он выберет самый правый. Примите во внимание, что это не всегда лучший выбор.
Иногда невозможно выиграть, но вы все равно должны показать максимальную сумму, которую вы можете добавить, играя против этого оппонента (или, скажем, стратегии).
Пример:
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; }
}
}