轮流取数,最大收益游戏

有一个整数串,有两个人轮流取,每次可以取走一个前缀或后缀。两人都足够聪明,且都会使自己收益最大。求取完后先手收益。

 

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])
View Code

 

转载于:https://www.cnblogs.com/suek/p/7680250.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值