取硬币策略——递归
问题描述
假设一行n个硬币的值为v1…Vn。两位玩家一起玩游戏,在每个回合中,玩家选择第一个或最后一个硬币,将其从行中移除,并获得硬币的价值。如果我们先进行选择,计算我们能赢的最大金额。
解题思路
输入:5 3 7 10
输出:15(10+5)
输入:8 15 3 7
输出:22(7+15)
如果先选8,那么第二个人会选择15,第一个选择7,第二个选择3,会输掉,因此不能简单的比较大小。
对手肯定会选择给用户留下最小的硬币和,因此可以拿到的总和应该是v[i]+min(F[i=2,j], F[i+1,j-1])或者是v[j]+min(F[i+1,j-1],F[i,j-2]),也就是:
F[i][j] = max(v[i]+min(F[i+2,j], F[i+1,j-1]), v[j]+min(F[i+1,j-1],F[i,j-2]))
if i==j, F[i][j]=v[i];
if j=i+1, F[i][j]=max(v[i], v[j])
python代码
def F(