AtCoder Beginner Contest 210 D - National Railway(枚举,优化)

Posted issue是fw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AtCoder Beginner Contest 210 D - National Railway(枚举,优化)相关的知识,希望对你有一定的参考价值。

LINK


选定节点 ( i , j ) (i,j) (i,j) ( q , w ) (q,w) (q,w),假定 i < = q & & j < = w i<=q\\&\\&j<=w i<=q&&j<=w

那么代价为

A i , j + A q , w + C ∗ ( q − i + w − j ) A_{i,j}+A_{q,w}+C*(q-i+w-j) Ai,j+Aq,w+C(qi+wj)

其中 ( i , j ) 造 成 的 代 价 为 (i,j)造成的代价为 (i,j) A i , j − C ∗ ( i + j ) A_{i,j}-C*(i+j) Ai,jC(i+j)

( q , w ) (q,w) (q,w)造成的代价为 A q , w + C ∗ ( q + w ) A_{q,w}+C*(q+w) Aq,w+C(q+w)

所以我们可以枚举 ( i , j ) (i,j) (i,j)作为左上的那个点,只需要对右下的所有 ( q , w ) (q,w) (q,w)取一个最小值即可

这个可以使用二维树状数组/线段树,不过我们有更好的做法

我们枚举 ( i , j ) (i,j) (i,j)时, i i i从最后一行往上枚举, j j j从最后一列往左枚举

定义 f [ i ] [ j ] f[i][j] f[i][j]表示以 ( i , j ) (i,j) (i,j)为左上角 ( H , W ) (H,W) (H,W)为右下角的矩阵内最小权值

转移方程为 f [ i ] [ j ] = min ⁡ ( f [ i + 1 ] [ j ] , f [ i ] [ j + 1 ] , A i , j ) f[i][j]=\\min(f[i+1][j],f[i][j+1],A_{i,j}) f[i][j]=min(f[i+1][j],f[i][j+1],Ai,j)

这样如果枚举 ( i , j ) (i,j) (i,j)作为左上点,那么此时最优答案是

A i , j − C ∗ ( i + j ) + min ⁡ ( f [ i ] [ j + 1 ] , f [ i + 1 ] [ j ] ) A_{i,j}-C*(i+j)+\\min(f[i][j+1],f[i+1][j]) Ai,jC(i+j)+min(f[i][j+1],f[i+1][j])

这样只计算了一个点在左上一个点在右下的情况

还需要做一遍一个点在左下,另一个点在右上的情况

此时维护的 f [ i ] [ j ] f[i][j] f[i][j]应该表示 ( i , j ) (i,j) (i,j)为左下角 ( 1 , W ) (1,W) (1,W)为右上角的矩阵的最小值,然后类似上面计算答案

代码就不写了…

以上是关于AtCoder Beginner Contest 210 D - National Railway(枚举,优化)的主要内容,如果未能解决你的问题,请参考以下文章

AtCoder Beginner Contest 234

AtCoder Beginner Contest 115 题解

AtCoder Beginner Contest 154 题解

AtCoder Beginner Contest 103

AtCoder Beginner Contest 228

AtCoder Beginner Contest 242