[ABC358G] AtCoder Tour 题解

思路

思路是简单的,使用分层图的思想递推地求出对于每个格子走了 kn×mk\leq n\times m 步之后最大的价值(记为 valx,y,kval_{x,y,k},递推式为 valx,y,k=max{valx,y,k1+ax,y},xx+yy1val_{x,y,k}=\max\{val_{x',y',k-1}+a_{x,y}\},|x'-x|+|y'-y|\leq 1),记 mk=min(k,n×m)mk=\min(k,n\times m),最后答案则是 max{valx,y,mk+ax,y×(kmk)}\max\{val_{x,y,mk}+a_{x,y}\times (k-mk)\},时间复杂度 O(n2m2)\mathcal{O}(n^2m^2)

这里证明一下“至多走 n×mn\times m 步之后就会停留在一个格子里这个结论”。

考虑反证法,假设用上文的方法求出来的答案为 ans0ans_0,最后停在 ax,ya_{x,y}。有一条路径 pp 已经把所有 n×mn\times m 个格子都走过一遍了,却还在继续移动,没有停在一个格子里,最后得到的价值为 ans1ans_1,且 ans1>ans0ans_1>ans_0

沿用上文的定义,则 ans1a>ans0aans_1-\sum{a}>ans_0-\sum{a}ans1a>ax,y×(kmk)ans_1-\sum{a}>a_{x,y}\times (k-mk)

这意味着 pp 经过的之后的格子里的价值总和的平均值一定高于 ax,ya_{x,y},也就是一定 ax,yp,ax,y>ax,y\exist a_{x',y'}\in p,a_{x',y'}>a_{x,y};那么把所有格子走一遍然后停在 ax,ya_{x',y'} 最后得到的价值一定高于原来的 ans0ans_0,与一开始 ans0ans_0 为最优解的条件矛盾,于是结论得证。

代码

一些神必错误可能会使你 WA on #9,每个人的情况都不同,于是贴出代码供参考。

link