Rezolvare completă PbInfo #3410 SubmatrixSumMax

Se dă o matrice de numere întregi cu n linii și n coloane.

Cerința

Să se determine suma maximă care se poate obține dintr-o submatrice.

Date de intrare

Programul citește de la tastatură numărul n, iar apoi elementele matricei cu n linii și n coloane.

Date de ieșire

Programul va afișa pe ecran suma maximă care se poate obține dintr-o submatrice.

Restricții și precizări

  • 1 ≤ n ≤ 300
  • Elementele matricei sunt numere întregi din intervalul [-1000, 1000]
  • O submatrice poate fi formată dintr-un singur element

Exemplu

Intrare

5
2 4 -1 2 -1
4 -7 1 -6 -1
-9 2 4 5 -7
1 3 -2 6 2
1 -4 -6 -5 8

Ieșire

18

Explicație

Submatricea de sumă maximă este:
2 4 5
3 -2 6

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema SubmatrixSumMax:

#include <bits/stdc++.h>

using namespace std;

int a[305][305], b[305][305], v[305], n;

void Citire()
{
    int i, j;
    cin >> n;
    for (i = 1; i <= n; ++i)
        for (j = 1; j <= n; j++)
            cin >> a[i][j];
}

void SumePartiale()
{
    int i, j;
    for (i = 1; i <= n; ++i)
        for (j = 1; j <= n; j++)
            b[i][j] = a[i][j] + b[i-1][j];
}

int SecSumMax(int v[], int n)
{
    int i, s, smax;
    s = smax = v[1];
    if (s < 0) s = 0;
    for (i = 2; i <= n; ++i)
    {
        s += v[i];
        if (s > smax) smax = s;
        if (s < 0) s = 0;
    }
    return smax;
}

void Solutie()
{
    int i1, i2, j, ssmax, suma;
    ssmax = -200000000;
    for (i1 = 1; i1 <= n; ++i1)
        for (i2 = i1; i2 <= n; ++i2)
        {
            for (j = 1; j <= n; j++)
                v[j] = b[i2][j] - b[i1 - 1][j];
            suma = SecSumMax(v, n);
            ssmax = max(ssmax, suma);
        }

    cout << ssmax;
}

int main()
{
    Citire();
    SumePartiale();
    Solutie();
    return 0;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #3410 SubmatrixSumMax

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #3410 SubmatrixSumMax de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!