问题在于遵循以下规则在游戏的每一刻选择最佳选项:
您只能选择最左边或最右边的卡片。
你的对手总是先选择,并且总是从最左边或最右边的牌中选择最高的牌。如果是平局,它将选择最右边的。考虑到这并不总是最好的选择。
有时不可能赢,但无论如何你必须展示你可以通过与这个对手比赛(或策略,比方说)来增加的最高金额。
例子:
Cards: 1 2 4 2 8 4 3
Opponent: 3 4 2 2 = 11
Me: 1 8 4 = 13
在这里,我在第二回合选择了 1 而不是 4,所以我可以稍后再选择 8。这就是为什么选择最高的牌并不总是最好的。
我一直在尝试使用递归来实现此解决方案,但我不确定它是否是最佳选择。关于如何设计这个算法的任何想法?
[编辑] 感谢@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; }
}
}