ABC358G AtCoder Tour 题解
发表于|更新于
|阅读量:
思路
思路是简单的,使用分层图的思想递推地求出对于每个格子走了 k≤n×m 步之后最大的价值(记为 valx,y,k,递推式为 valx,y,k=max{valx′,y′,k−1+ax,y},∣x′−x∣+∣y′−y∣≤1),记 mk=min(k,n×m),最后答案则是 max{valx,y,mk+ax,y×(k−mk)},时间复杂度 O(n2m2)。
这里证明一下“至多走 n×m 步之后就会停留在一个格子里这个结论”。
考虑反证法,假设用上文的方法求出来的答案为 ans0,最后停在 ax,y。有一条路径 p 已经把所有 n×m 个格子都走过一遍了,却还在继续移动,没有停在一个格子里,最后得到的价值为 ans1,且 ans1>ans0。
沿用上文的定义,则 ans1−∑a>ans0−∑a 即 ans1−∑a>ax,y×(k−mk)。
这意味着 p 经过的之后的格子里的价值总和的平均值一定高于 ax,y,也就是一定 ∃ax′,y′∈p,ax′,y′>ax,y;那么把所有格子走一遍然后停在 ax′,y′ 最后得到的价值一定高于原来的 ans0,与一开始 ans0 为最优解的条件矛盾,于是结论得证。
代码
一些神必错误可能会使你 WA on #9,每个人的情况都不同,于是贴出代码供参考。
link