帶限制條件的最大子矩陣 牛客

2022-06-27 03:27:13 字數 1532 閱讀 7240

矩陣 m 包含 r 行 c 列,第 i 行第 j 列的值為 mi,j。

請尋找乙個子矩陣,使得這個子矩陣的和最大,且滿足以下三個條件:

子矩陣的行數不能超過 x 行。

子矩陣的列數不能超過 y 列。

子矩陣中 0 的個數不能超過 z 個。

請輸出滿足以上條件的最大子矩陣和。

第一行輸入五個整數 r,c,x,y,z。
接下來 n 行,每行輸入 m 個整數,第 i 行第 j 列的整數表示 mi,j。

1 ≤ r,c ≤ 500.

1 ≤ x ≤ r.

1 ≤ y ≤ c.

1 ≤ z ≤ r x c.

-10

9
≤  m
i,j
≤ 10
9
輸出滿足以上條件的最大子矩陣和。
示例1

複製

5 5 3 3 4

0 0 10 0 0

3 4 0 2 3

-1 3 0 -8 3

0 0 32 -9 3

3 0 45 3 0

複製

82

示例2複製

2 2 2 2 2

-1 -1

-1 -1

複製

0

題意 : 在乙個大的矩陣中尋找乙個小的矩陣,但是行列是有要求的。

思路分析: 枚舉行的起點和終點,複雜度是 o(n^2) , 通過預處理字首和,可以得到此時的一行的數,再o(n)的用單調佇列搞一下即可

**示例 : (wa 了 , 還在除錯中 )

#include using namespace std;

#define ll long long

const ll maxn = 1e6+5;

typedef pairpa;

ll n, m;

ll x, y, z;

ll mp[505][505], sum[505][505], cnt[505][505], ze[505][505];

ll f[505], f2[505];

pa que[2005];

int main()

}

for(ll i = 1; i <= n; i++)

} ll ans = 0;

for(ll i = 1; i <= n; i++)

que[r++] = make_pair(f[k], k);

while(l < r && k-que[l].second+1 > y)

while(l < r && f2[k]-f2[que[l].second-1] > z)

if (l< r) ans = max(ans, f[k]-f[que[l].second-1]);

//prllf("%lld %lld %lld %lld l = %lld r = %lld \n", i, j, k, ans, l, r);}}

}printf("%lld\n", ans);

return 0;

}

最大子矩陣的和

給出乙個n 2 n 100 並給出乙個n n的矩陣,矩陣中的數為 127,127 之間。求出矩陣中一塊子矩陣的最大和。比如 0 2 709 2 62 41 41 1 80 2和最大的子矩陣應該是這個 92 41 1 8它的和是15。第一行 整數n 接下來n行,每行n個整數,表示矩陣每個點所代表的值。...

求矩陣的最大子矩陣面積

問題引入 求解直方圖中最大的矩形面積 核心思想 讓二維陣列轉換成多層的一維陣列,再根據一維陣列構建直方圖 主函式,讓二維陣列轉換成多層的一維陣列,再根據一維陣列構建直方圖 public intmaxrecsize int map int maxarea 0 int height newint map...

求最大子矩陣的大小

給定乙個整型矩陣map,其中的值只有0和1兩種,求其中全是1的所有矩形區域中,最大矩形區域為1的數量。時間複雜度達到o mn 具體思路請參考原書 include include include using namespace std intmaxrecfrombottom int height,in...