正难则反 || solution - CF859C

· · 题解

## Solution 首先这种博弈论是 dp 的概率非常大,于是考虑 dp。 不过似乎很难做,因为无论怎么设计状态总是会有后效性。 那么,正难则反,既然正着 dp 很难处理,于是考虑反过来 dp! 设 $f_i$ 为轮到先手选 $i$,只考虑 $i \sim n$ 的时候的最大权值和,那么分讨选或不选,选则减去不选就直接是 $f_{i+1}$;选则把 $f_{i+1}$ 减掉,剩下的就是 $f_i$(可以后缀和优化掉)。 也就是方程(其中 $s_i$ 为后缀和数组): $$ f_{i} = \max (f_{i+1} , s_i - f_{i+1}) $$ 于是,我们便用 $O(n)$ 的时间复杂度过了 $n \le 50$,这甚至比 $n^2$ 过百万还罕见。 ## Code ```cpp int n,a[MAXN],f[MAXN],s[MAXN]; signed main() { read(n),_::r(a,n); rpe(i,n,1) s[i]=s[i+1]+a[i]; rpe(i,n,1) f[i]=max(f[i+1],s[i]-f[i+1]); write(s[1]-f[1],f[1]); return 0; } ``` --- 华风夏韵,洛水天依!