Editorial for K өдрийн оноо


Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.

Author: admin

? Editorial — Maximum Submatrix Sum (2D Kadane)

? Бодлогын ойлголт

Олонлог эгзэ сургуулийн үйл ажиллагаа матриц хэлбэртэй:

  • мөр → өдөр
  • багана → анги

? Та нэг тэгш өнцөгт хэсэг сонгож ? нийлбэрийг хамгийн их болгоно


❌ 1-р санаа: Brute Force

Бүх боломжит тэгш өнцөгт шалгана:

  • top, bottom, left, right

⏱️ O(N² × M²) → маш удаан


? 2-р санаа: Prefix Sum (2D)

2D prefix ашиглаж болно

Гэхдээ:

  • Тэгш өнцөгт бүрийг шалгана
  • Одоо ч O(N²M²)

? хангалтгүй


? 3-р санаа: 2D → 1D бууруулах

Энэ бол гол trick ?

Алхам:
  1. top мөр сонгоно
  2. bottom мөр сонгоно

? Энэ хоёрын хооронд бүх мөрийг нийлүүлнэ


? Row Compression

temp[j] = column j-ийн нийлбэр (top → bottom)

? Ингэснээр: 2D → 1D массив боллоо


? 4-р санаа: Kadane ашиглах

temp массив дээр:

? хамгийн их дэд массив = хамгийн сайн багана хэсэг


⚡ Алгоритм

for top: temp = 0 for bottom: update temp run Kadane


⏱️ Хугацаа

  • O(N² × M)
  • 200 × 200 → OK

? C++ код

#include <bits/stdc++.h>
using namespace std;

int main() {
    int N, M;
    cin >> N >> M;

    vector<vector<int>> a(N, vector<int>(M));

    for(int i = 0; i < N; i++)
        for(int j = 0; j < M; j++)
            cin >> a[i][j];

    long long ans = LLONG_MIN;

    for(int top = 0; top < N; top++) {
        vector<long long> temp(M, 0);

        for(int bottom = top; bottom < N; bottom++) {

            for(int j = 0; j < M; j++)
                temp[j] += a[bottom][j];

            long long cur = temp[0], best = temp[0];

            for(int j = 1; j < M; j++) {
                cur = max(temp[j], cur + temp[j]);
                best = max(best, cur);
            }

            ans = max(ans, best);
        }
    }

    cout << ans << endl;
}

? Яагаад зөв вэ?

  • Бүх мөрийн хосыг шалгаж байна
  • Тэр бүрт баганаар хамгийн сайн хэсгийг олж байна

? Бүх боломжит тэгш өнцөгтийг хамарна


? Сурагчдад зөвлөгөө

  1. Kadane-г сайн ойлго
  2. 2D асуудлыг 1D болгох сэтгэлгээ
  3. Compression trick сурах

? Энэ бол олимпиадын түвшний классик бодлого ?


Comments

There are no comments at the moment.