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{fi−1,j,k,fi,j−1,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,k−1+sum1i−sum1p∣0≤p≤i}
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,k−1+sum2j−sum2p∣0≤p≤j}
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,k−1+sum1i−sum1p+sum2j−sum2p∣0≤p≤i,i=j}
最后答案是 f n , n , k f_{n,n,k} fn,n,k。
大致注意点就是一个
f
f
f 初始化要是 -INF
,另外一个点就是需要先枚举第三维,如果不先枚举第三维就是错误的,具体为啥参照 Floyd 正确性证明。