题意:
有一个数列,两个人分别从两端开始取数字,左边的先取,第一次能取1个或2个,然后轮流取得时候,如果第一个取了k个,后一个人只能取k或k+1个,如果剩下的不够了则游戏终止,I想要最大化两个人取得数字之和的差距,Z想要最小化,两个人都选择最优操作
题解:
CF官方题解写的非常好完全是按照那个写的,也写得很清楚


这个我当时完全没看出来dp(没做过类似的题目
但看了之后,这个状态转移方程还是很好理解的
主要还有一个重点是空间时间复杂度
上述算法看起来是n3次的dp[L][R][K]
但实际上L最多只能达到2000多一点的样子(I多拿一次数字的情况下
K需要从一开始增加,从1开始增加到最大1,2,……,k sum=k*(k+1)/2 k<=sqrt(2*n)也就是90左右
在来看R,R代表的是Z先生拿到的位置,设d为I与Z取走数字数量之差,d=(n - r) - (l - 1)
如果我们考虑I先生和Z先生move次数相同的话,那么0<=d<=k-1
如果I先生多走一次,d就会增加一个k(但实际试了下开90和180都能过?我不太懂了
所以最终我们只需要dp[2100][180][180]
时空复杂度都是n*n左右
#include
#include