题解:P2975 [USACO10JAN] Taking Turns G

· · 题解

好题!有点像博弈论的 DP。

题目描述

两头奶牛 Bessi 和 Dessie 走过一条路吃草,共 n(1\le n \le 7\times 10 ^ 5) 个格子,第 i 个格子有重量为 W_i(1 \le W_i \le 2 \times 10 ^{9}) 的草,两牛轮流走,一旦某头牛走过了一格,那么这格的草再也不可能被任一头奶牛吃,每格的草只能被吃一次,所以两头牛只能往后走。Bessi 先走,每头牛每次都往最终自己能吃到最多草的格子走(若有多个格子则选择第一个能吃到最多草的格子),他们都知道对方也想吃到最多的草,问最后 Bessi 和 Dessie 各吃到的草的重量。

思路

其他题解的状态定义似乎没表述清楚。

f_i 表示到了现在这头牛吃(先手),吃 i 及以后的草堆所能获得的最大价值。

g_i 表示下头牛吃(后手),吃 i 及以后的草堆所能获得的最大价值。

假设现在该 A 牛吃(先手),A 吃完后,此时 B 成了先手,A 成了后手。B 吃完后 A 又成为先手……一头牛的先后手是交替的。

草堆从 n 循环到 1,初始 f_{n+1}=g_{n+1}=0

先手先选(废话),先手肯定选择 f_{i+1}g_{i+1}+w_i 中最大的(即不选或者选择草堆 i)。

最后输出 f_1(先手最优)和 g_1(后手最优)就行了。