もし×Mの行列を与えるnは整数上で部分行列X×Yを見つけるために、ある部分行列の最大とすべての要素。
入力
入力データTの最初の行の正の整数、Tがテストデータのセットを表します。まず、各動作のためのテストデータのセット4つの正の整数M、N、X、Y(0 <M、N <1000および0 <X <= Mおよび0 <Y <= n)は、指定された矩形を表し有しますm行n列。次に、m行n個の各々とこの行列1000より大きくない正の整数です。
出力
各試験、出力整数ため、サブ行列の最大値を表します。
サンプル入力
1
4 5 2 2
3 361 649 676 588
992 762 156 993 169
662 34 638 89 543
525 165 254 809 280
サンプル出力
2474
#include <ビット/ STDC ++。H> 長い長いLLのtypedef。 名前空間stdを使用。 int型ARR [1010] [1010]、M、N、X、Y。 int型lowbit(int型x)は、 { X&-x返します。 } ツリーの///二次元アレイ ボイド追加(int型のx、int型Y、INT TT)///変性単一点 { 用(INT I = X; I <M、I + = lowbit(I)) 用(INT J = yであり、j <N; J + = lowbit(J)) { ARR [I] [J] + = TT。 } } あなたは(あなたは、yとx)の合計します { int型、A = 0; ( - = lowbit(I)I; I int型I = X)のために 用(int型J = Y; J; J - = lowbit(J)) { RES + = ARR [I] [J]。 } 解像度を返します。 } INTクエリ(INT L、INT B、int型のR、INT T)///和行列 { 戻り和(R、T)+ SUM(L - 1、B - 1) - SUM(R、B - 1) - 和(L - 1、T)。 } メインint型() { int型T; scanf関数( "%のD"、&T)。 一方、(T - ){ scanf関数( "%D%D%D%D"、&M、およびN、およびX&Y)。 以下のために(INT I = 1; I <= M; I ++){ {(J ++; J <= Nのint J = 1)のために ARR [I] [J] = 0; } } int型のk = 0年、GG。 以下のために(INT I = 1; I <= M; I ++){ {(J ++; J <= Nのint J = 1)のために scanf関数( "%のD"、&K); (i、j、k)を追加します。 } } 以下のために(INT I 1 =; I + X - 1 <= M; I ++){ {; - ;(j ++ 1 <= N J + Y INT J = 1)のために GG =クエリ(I、J、I + X - 1、J + Y - 1)。 年= MAX(年GG)。 } } printf( "%dの\ n" は、ANS)。 } 0を返します。 }