HDU1559 最大子矩阵和(二维前缀和模板)

二维前缀和可以实现一个矩形区域内的求和问题,而本题恰好就是要求一个矩阵内部的和的最大值,所以直接套用二维前缀和并在结尾进行最大值更新即可。

#include【HDU1559 最大子矩阵和(二维前缀和模板)】#include #include #include #include #include #include #include #include #include #include #define DETERMINATION main #pragma GCC optimize(2) #pragma warning(disable:4996) #define lldin(a) scanf("%lld", &a) #define println(a) printf("%lld\n", a) #define print(a) printf("%lld ", a) #define reset(a, b) memset(a, b, sizeof(a)) #define debug cout<<"procedures above are available"< //inline BigInteger nextLong() //{ // BigInteger tmp = 0, si = 1; // char c; // c = getchar(); // while (!isdigit(c)) // { //if (c == '-') //si = -1; //c = getchar(); // } // while (isdigit(c)) // { //tmp = tmp * 10 + c - '0'; //c = getchar(); // } // return si * tmp; //} //std::ostream& operator<<(std::ostream& os, __int128 T) //{ //if (T<0) os<<"-"; if (T>=10 ) os<0 ? (int) (T%10) : -(int) (T%10) ) ; //} //void output(BigInteger x) //{ // if (x < 0) // { //x = -x; //putchar('-'); // } // if (x > 9) output(x / 10); // putchar(x % 10 + '0'); //} /**Maintain your determination.Nobody knows the magnificent landscape at his destination before the arrival with stumble.**/ /**Last Remote**/ ll sum[1200][1200]; ll matrix[1200][1200]; int DETERMINATION() { ios::sync_with_stdio(false); cin.tie(0), cout.tie(0); ll t; cin >> t; while (t--) { ll m, n, x, y; cin >> m >> n >> x >> y; for (int i = 1; i <= m; i++) for (int j = 1; j <= n; j++) sum[i][j] = 0; for(int i=1; i<=m; i++) for (int j = 1; j <= n; j++) { cin >> matrix[i][j]; sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + matrix[i][j]; } ll ans = 0; for(int i=x; i<=m; i++) for (int j = y; j <= n; j++) { ans = max(ans, sum[i][j] - sum[i - x][j] - sum[i][j - y] + sum[i - x][j - y]); } cout << ans << endl; } return 0; }


    推荐阅读