轮流取数,最大收益游戏
有一个整数串,有两个人轮流取,每次可以取走一个前缀或后缀。两人都足够聪明,且都会使自己收益最大。求取完后先手收益。
import numpy as np from random import shuffle n = 40 li = list(range(1, n+1)) shuffle(li) sl = [] tmps = 0 for x in li: tmps += x sl.append(tmps) def lsij(ls, i, j): return ls[j] - ls[i-1] if i else ls[j] result = np.zeros((n, n), dtype=int) for i in range(n): result[i, i] = li[i] for x in range(1, n): for i in range(n-x+1): j = i + x if j > n-1: break result[i, j] = lsij(sl, i, j) - min(result[i+1, j], result[i, j-1]) print(result[0, n-1])