问题在于在游戏的每个时刻选择最佳选项,遵循以下规则:
例子:
在第二轮中,我选择了1而不是4,因此稍后就可以选择8。这就是为什么选择最高牌并不总是最佳选择的原因。
我一直在尝试使用递归来实现这个解决方案,但我不确定这是否是最佳选择。有没有关于如何设计该算法的想法?
[编辑] 感谢@PengOne的慷慨帮助。这是我正在尝试实现的代码,但不幸的是它给我报错。我应该怎么修复它?随着我的进展,我会进行编辑。
- 您只能选择最左边或最右边的卡片。
- 您的对手将始终先行动,并且始终选择最左边或最右边的卡片中最高的一张。如果出现平局,则会选择最右边的卡片。请注意,这并不总是最佳选择。
例子:
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; }
}
}