Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const int inf = 1e9;
- const int N = 3e2;
- int ar[N + 10][N + 10], qs[N + 10][N + 10], two[N + 10][N + 10][N + 10], keep[N + 10][N + 10];
- int n, m, ans = 0;
- void Reset(){
- for(int i = 0; i <= N + 1; i ++){
- for(int j = 0; j <= N + 1; j ++){
- qs[i][j] = 0;
- keep[i][j] = 0;
- for(int k = 0; k <= N + 1; k ++)
- two[i][j][k] = -inf;
- }
- }
- }
- void Solve(){
- Reset();
- /// Quick Sum
- for(int i = 1; i <= n; i ++){
- for(int j = 1; j <= m; j ++){
- qs[i][j] = ar[i][j] + qs[i][j - 1];
- }
- }
- for(int l = 1; l <= m; l ++){
- for(int r = l; r <= m; r ++){
- int mx = 0;
- for(int i = n; i >= 3; i --){
- int cur = qs[i][r] - qs[i][l - 1];
- mx = max(mx + cur, cur);
- two[i - 2][l][r] = mx;
- }
- }
- }
- for(int i = n; i >= 1; i --){
- for(int len = 1; len <= m; len ++){ /// ระวังตรงนี้
- /// ให้ทำทีละความยาว เพราะ ถ้าทำโดย fix l ไว้แล้วค่อย ๆ เพิ่ม r จะทำให้ค่า
- /// max บางค่าไม่ได้มาจากรูปที่ใหญ่กว่า แต่อาจมาจากรูปที่เล็กกว่าก็ได้
- for(int l = 1; l <= m - len + 1; l ++){
- int r = l + len - 1;
- for(int ll: {0, -1}){
- for(int rr: {0, 1}){
- for(int ii: {0, -1}){
- two[i + ii][l + ll][r + rr] = max(two[i + ii][l + ll][r + rr], two[i][l][r]);
- }
- }
- }
- }
- }
- }
- for(int l = 1; l <= m; l ++){
- for(int r = l; r <= m; r ++){
- int mx = 0;
- for(int i = 1; i <= n; i ++){
- int cur = qs[i][r] - qs[i][l - 1];
- mx = max(mx + cur, cur);
- ans = max(ans, mx + two[i][l][r]);
- }
- }
- }
- }
- void Rotate(int ii = 1, int jj = m){
- for(int i = 1; i <= n; i ++){
- for(int j = 1; j <= m; j ++){
- keep[i][j] = ar[i][j];
- }
- }
- for(int i = 1; i <= m; i ++){
- ii = 1;
- for(int j = 1; j <= n; j ++){
- ar[i][j] = keep[ii][jj];
- ii ++;
- }
- jj --;
- }
- swap(n, m);
- }
- int main(){
- scanf("%d %d", &n, &m);
- for(int i = 1; i <= n; i ++){
- for(int j = 1; j <= m; j ++){
- scanf("%d", &ar[i][j]);
- }
- }
- Solve();
- Rotate();
- Solve();
- Rotate();
- Solve();
- Rotate();
- Solve();
- printf("%d", ans);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement