P2331 [SCOI2005]最大子矩阵 题解

DP 题,好像有点恶心,主要是因为能不能选空矩阵的问题。

有些数据好像是可以选空矩阵的有些又不能选,就很离谱,但是根据原数据来看空矩阵应该是不能选的,我也不知道具体情况()

注意到 m = 1 m=1 m=1 的情况是经典问题,因此直接跳 m = 2 m=2 m=2

f i , j , k f_{i,j,k} fi,j,k 表示第一列做到前 i i i 个,第二列做到前 j j j 个,总共选了 k k k 个子矩阵的结果。

那么考虑对于每一列枚举一个 p p p 表示将 [ p , i ] / [ p , j ] [p,i]/[p,j] [p,i]/[p,j] 作为一个新矩阵转移,然后就是如果 i = j i=j i=j 那么可以两列一起转移,需要一个列上的前缀和。

转移方程如下:

f i , j , k = max ⁡ { f i − 1 , j , k , f i , j − 1 , k } f_{i,j,k}=\max\{f_{i-1,j,k},f_{i,j-1,k}\} fi,j,k=max{fi1,j,k,fi,j1,k}

f i , j , k = max ⁡ { f p , j , k − 1 + s u m 1 i − s u m 1 p ∣ 0 ≤ p ≤ i } f_{i,j,k}=\max\{f_{p,j,k-1}+sum1_{i}-sum1_{p} \mid 0 \leq p \leq i\} fi,j,k=max{fp,j,k1+sum1isum1p0pi}

f i , j , k = max ⁡ { f i . p , k − 1 + s u m 2 j − s u m 2 p ∣ 0 ≤ p ≤ j } f_{i,j,k}=\max\{f_{i.p,k-1}+sum2_j-sum2_p \mid 0 \leq p \leq j\} fi,j,k=max{fi.p,k1+sum2jsum2p0pj}

f i , j , k = max ⁡ { f p , p , k − 1 + s u m 1 i − s u m 1 p + s u m 2 j − s u m 2 p ∣ 0 ≤ p ≤ i , i = j } f_{i,j,k}=\max\{f_{p,p,k-1}+sum1_i-sum1_p+sum2_j-sum2_p \mid 0 \leq p \leq i,i=j\} fi,j,k=max{fp,p,k1+sum1isum1p+sum2jsum2p0pi,i=j}

最后答案是 f n , n , k f_{n,n,k} fn,n,k

大致注意点就是一个 f f f 初始化要是 -INF,另外一个点就是需要先枚举第三维,如果不先枚举第三维就是错误的,具体为啥参照 Floyd 正确性证明。

Code:GitHub CodeBase-of-Plozia P2331 [SCOI2005]最大子矩阵.cpp

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值