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)为右上角的矩阵的最小值,然后类似上面计算答案

代码就不写了…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值