NC17070マトリックス(プレフィックスと+モノトーンキュー)

最大のサブマトリックスと問題は、通常、最初にプレフィックスと行を使用して計算され、次に分割して保持され、列方向に単調なキューを作成します

この複雑さは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、0sizeof g); 
            memset(tmp、0sizeoftmp);
            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を返し ます
}
コードを表示

 

おすすめ

転載: www.cnblogs.com/ctyakwf/p/12685830.html