DP 题,好像有点恶心,主要是因为能不能选空矩阵的问题。
有些数据好像是可以选空矩阵的有些又不能选,就很离谱,但是根据原数据来看空矩阵应该是不能选的,我也不知道具体情况()
注意到 m=1 的情况是经典问题,因此直接跳 m=2。
设 fi,j,k 表示第一列做到前 i 个,第二列做到前 j 个,总共选了 k 个子矩阵的结果。
那么考虑对于每一列枚举一个 p 表示将 [p,i]/[p,j] 作为一个新矩阵转移,然后就是如果 i=j 那么可以两列一起转移,需要一个列上的前缀和。
转移方程如下:
fi,j,k=max{fi−1,j,k,fi,j−1,k}
fi,j,k=max{fp,j,k−1+sum1i−sum1p∣0≤p≤i}
fi,j,k=max{fi.p,k−1+sum2j−sum2p∣0≤p≤j}
fi,j,k=max{fp,p,k−1+sum1i−sum1p+sum2j−sum2p∣0≤p≤i,i=j}
最后答案是 fn,n,k。
大致注意点就是一个 f 初始化要是 -INF
,另外一个点就是需要先枚举第三维,如果不先枚举第三维就是错误的,具体为啥参照 Floyd 正确性证明。
Code:GitHub CodeBase-of-Plozia P2331 [SCOI2005]最大子矩阵.cpp
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具