P2331 [SCOI2005]最大子矩阵 题解

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

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

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

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

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

转移方程如下:

fi,j,k=max{fi1,j,k,fi,j1,k}

fi,j,k=max{fp,j,k1+sum1isum1p0pi}

fi,j,k=max{fi.p,k1+sum2jsum2p0pj}

fi,j,k=max{fp,p,k1+sum1isum1p+sum2jsum2p0pi,i=j}

最后答案是 fn,n,k

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

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

posted @   Plozia  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示