两端取数游戏:
一个数列 a a a
每次只能取出两端的数,先后手互换。
1.博弈版本:数字和大者胜,求先手必胜策略。
首先在 ∣ a ∣ ≡ 1 ( m o d 2 ) |a| \equiv 1 \pmod 2 ∣a∣≡1(mod2)时是不一定赢的。
比如:7 9 3 5 2
可以发现先手是必输的。
然后在 2 ∣ ∣ a ∣ \small2 \large| \small|a| 2∣∣a∣时,
可以选第一个,然后对方只能选第2或n个。
发现2和n都是偶数。
实际上你可以一直拿第奇数个使得对面只能拿第偶数个。
那么如果第奇数个的和大于第偶数个,那么你就赢了。
反之如果小于,可以第一次拿第n个,对面只能拿第奇数个。
如果等于?所以只能先手必不败。
2.博弈(贪心)版本:每个人想自己拿的数字和尽量大,求双方最优策略下的先手拿的数字和。
首先显然可以 O ( n 2 ) D P O(n^2)DP O(n2)DP
但是这个解法太过低效思博。
我们需要一个高效高论的方法来解决出加大范围的好毒瘤题。
需要转化。
像合并石子游戏的 O ( n log n ) O(n\log n) O(nlogn)解法一样,我们需要考虑只有3个数的时候我们可不可以把这3个数合并。
如果 a [ 0 ] = x , a [ 1 ] = y , a [ 2 ] = z a[0] = x , a[1] = y , a[2] = z a[0]=x,a[1]=y,a[2]=z, x < = y > = z x<=y>=z x<=y>=z。
那么可以意会,先手拿x,后手拿y,先手再拿z,合并为一个大小为 x + z − y x+z-y x+z−y的数。
但是会不会后手不拿 y y y