最大のサブマトリックスと問題は、通常、最初にプレフィックスと行を使用して計算され、次に分割して保持され、列方向に単調なキューを作成します
この複雑さはN ^ 3であり、数百のデータに十分です
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <map> #include < string > using namespace std; typedef long long ll; const int N = 2e5 + 5 ; const int mod = 19260817 ; ll g [ 505 ]; ll a [ 505 ] [ 505 ]; ll zero [ 505 ] [ 505 ]; int q [N]; ll tmp [505 ]; int main(){ int r、c; int x、y、z; cin >> r >> c >> x >> y >> z; int i、j; for(i = 1 ; i <= r; i ++ ){ for(j = 1 ; j <= c; j ++ ){ scanf(" %lld "、&a [i] [j]); if(a [i] [j] == 0 ){ zero [i] [j] = zero [i- 1 ] [j] + 1 ; } else { zero [i] [j]= zero [i- 1 ] [j]; } a [i] [j] + = a [i- 1 ] [j]; } } ll ans = 0 ; int k; for(i = 1 ; i <= r; i ++ ){ for(j = i; j <i + x && j <= r; j ++ ){ int hh = 0、tt = 0 ; q [ 0 ] = 0 ; memset(g、0、sizeof g); memset(tmp、0、sizeoftmp); for(k = 1 ; k <= c; k ++ ){ g [k] = a [j] [k] -a [i- 1 ] [k] + g [k- 1 ]; tmp [k] = zero [j] [k] -zero [i- 1 ] [k] + tmp [k- 1 ]; while(hh <= tt &&(tmp [k] -tmp [q [hh]]> z || kq [hh]> y)) hh ++ ; if(hh <= tt) ans = max(ans、g [k] -g [q [hh]]); 一方、(HH <= TT && G [Q [TT]]> = G [K]) TT -。 q [ ++ tt] = k; } } } cout << ans << endl; 0を返し ます。 }