pku1678 I Love this Game!

本文解析了一道关于两个人轮流从序列中取数的博弈问题,通过动态规划算法找到最大得分差值的解决方案,并提供了完整的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:http://acm.pku.edu.cn/JudgeOnline/problem?id=1678

题意简述:给定一行长度为2<=n<=10000的序列,两个人(p1和p2)分别去取其中的数,p1先取(设xi为p1所取的数),x1的范围为[a,b],且a,b的范围是(0,100],然后p2取数(设yi为p2所取的数),且y1-x1的范围为[a,b]…如此一直交叉取下去,直到不恩哪个再取为止,假设两人都是用最优的方法取数,求sum(xi)-sum(yi)的最大值。

解题思路:x(1),,x(n)是可以选择的数,注意到两个选手选出来的数都是递增的,所以我们现将X从小到大排序。我们假设第一个人选取一个x(k) (暂时还不需要要求x(k)属于[a,b])之后,以后每个人选的数都与前面那个数相差在ab之间,最后交替差能保证的最大值为dk当第一个选手选定第一个数y1=x(k)属于[a,b]之后,问题转化为第二个选手选择一个y2=x(m)属于[a+y1,b+y1],其中y2的选取是使得从y2开始,所得交替和能保证的最大值为dm,所以   dk=x(k)-max(di)

最后要求的并不是d0,而是 max(d[i]) 且d[i]的范围是[a,b]。

代码:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值