Wannafly挑战赛19

Wannafly挑战赛19


矩阵

  • 矩阵 M 包含 R 行 C 列,第 i 行第 j 列的值为 M(i,j)。
    请寻找一个子矩阵,使得这个子矩阵的和最大,且满足以下三个条件:
    子矩阵的行数不能超过 X 行。
    子矩阵的列数不能超过 Y 列。
    子矩阵中 0 的个数不能超过 Z 个。
    请输出满足以上条件的最大子矩阵和。

  • 去掉所有的条件后,可以发现是一个淳朴的二维矩阵求最大子矩阵。可以通过一维最大连续子数组的方式去解决它。
    现在首先考虑第二个限制,就是限制了一维数组的个数。
    现在,问题就转化为一维数组中,寻找连续的一段,保证0的出现次数的约束和数组长度的约束。
    0出现的次数的前缀和与数组的长度都是单调递增的。所以可以通过单调队列的方式解决。

  • 可以推广一下,如果在此时的一维数组中,需要约束的条件是单调的,也就是说,如果对于此位来说(队首元素不满足条件,需要出队),那么对于后面的位,后面的元素,也是不满足条件的。这样,就能满足单调性。
原文地址:https://www.cnblogs.com/nowheretrix/p/9307810.html