题目
描述
有 n 个硬币排成一条线, 第 i 枚硬币的价值为 values[i].
两个参赛者轮流从任意一边取一枚硬币, 直到没有硬币为止. 拿到硬币总价值更高的获胜.
请判定 第一个玩家 会赢还是会输.
样例
样例 1:
输入: [3, 2, 2]
输出: true
解释: 第一个玩家在刚开始的时候拿走 3, 然后两个人分别拿到一枚 2.
样例 2:
输入: [1, 20, 4]
输出: false
解释: 无论第一个玩家在第一轮拿走 1 还是 4, 第二个玩家都可以拿到 20.
分析
看完题目就知道这一道博弈型的动态规划,接下来分析先手的必胜条件,博弈型的动态规划,我们只需要分析先手就可以,正常来说先手完成一步后到了后手,这时我们要把后手当成现在的“先手”
举例
这种情况下就是先手必胜,先手选了1后无论后手选3或者2,先手都可以选到257,但是如果我们作为先手应该先选左边的还是右边的呢,这个时候我们就要看中间的数字3和257,如果我们想要3,就可以选择2然后无论后手怎么选,我们都能拿到3
如果是一个Arr[n]的数组时我们也是一样,先手选择第一个时,需要知道Arr[n-1]内的情况,所以这道题也是一道区间型的动态规划
先手要做到什么?后手要做到什么情况?
假设先手拿到的数字和为A,后手拿到的数字和B 那对先手来说A-B>=0先手就赢了,反之对后手来说B-A>=0就赢了,所以先手要做到使A-B尽可能地大,后手要做到B-A尽可能的大
状态f[i][j]为先手在i,j区间能拿到的最大差值,得到转移方程f[i][j]=max(A[i]-f[i+1]f[j],A[j]-f[i][j-1]).
解释:先手的有两种情况拿左边的或者是拿右边的,先手拿了左边的后后手面对的就是f[i+1][j],这时先手的最大差值就是当前拿走的这个A[i]减去f[i+1][j],因为B的要做的最大化B-A的值,就相当于A[i]-(B-A)