3410 - Submatrix Sum Max: Difference between revisions

From Bitnami MediaWiki
 
(4 intermediate revisions by 2 users not shown)
Line 2: Line 2:


==Cerință==
==Cerință==
 
Se dă o matrice de numere întregi cu '''n''' linii și '''n''' coloane.
Să se determine suma maximă care se poate obține dintr-o submatrice.
Să se determine suma maximă care se poate obține dintr-o submatrice.


Line 19: Line 19:
* O submatrice poate fi formată dintr-un singur element
* O submatrice poate fi formată dintr-un singur element


==Exemplu==
==Exemplul 1==


;Intrare
;Intrare
Line 31: Line 31:


;Ieșire
;Ieșire
:Datele introduse corespund restricțiilor impuse.


:18
:18
==Exemplul 2==
;Intrare
:1x
;Ieșire
:Datele introduse nu corespund restricțiilor impuse.


==Rezolvare==
==Rezolvare==
Line 38: Line 50:
<syntaxhighlight lang="python" line="1" start="1">
<syntaxhighlight lang="python" line="1" start="1">


def suma_maxima_submatrice(matrice):
def verificare_restrictii(numar, matrix):   # functia de verificare a datelor de intrare
     n = len(matrice) # numărul de linii/coloane din matrice
     if 1 <= numar <= 300 and all(-1000 <= element <= 1000 for rand in matrix for element in rand):
        return True
    else:
        return False
 
 
def suma_maxima_submatrice(numar, matrix):
     # inițializăm matricea de sume prefix cu 0
     # inițializăm matricea de sume prefix cu 0
     prefix_sum = [[0 for _ in range(n + 1)] for _ in range(n + 1)]
     prefix_sum = [[0 for _ in range(numar + 1)] for _ in range(numar + 1)]


     # calculăm matricea de sume prefix
     # calculăm matricea de sume prefix
     for i in range(n):
     for i in range(numar):
         for j in range(n):
         for j in range(numar):
             prefix_sum[i + 1][j + 1] = matrice[i][j] - prefix_sum[i][j] + prefix_sum[i][j + 1] + prefix_sum[i + 1][j]
             prefix_sum[i + 1][j + 1] = matrix[i][j] - prefix_sum[i][j] + prefix_sum[i][j + 1] + prefix_sum[i + 1][j]


     max_sum = float('-inf')  # inițializăm suma maximă cu -infinit
     max_sum = float('-inf')  # inițializăm suma maximă cu -infinit
     # parcurgem toate submatricile posibile
     # parcurgem toate submatricile posibile
     for i in range(1, n + 1):
     for i in range(1, numar + 1):
         for j in range(1, n + 1):
         for j in range(1, numar + 1):
             for k in range(i, n + 1):
             for k in range(i, numar + 1):
                 for l in range(j, n + 1):
                 for lenght in range(j, numar + 1):
                     # calculăm suma submatricei curente folosind sumele prefix
                     # calculăm suma submatricei curente folosind sumele prefix
                     curr_sum = prefix_sum[k][l] - prefix_sum[k][j - 1] - prefix_sum[i - 1][l] + prefix_sum[i - 1][j - 1]
                     curr_sum = prefix_sum[k][lenght] - prefix_sum[k][j - 1] - prefix_sum[i - 1][lenght] + prefix_sum[i - 1][j - 1]
                     max_sum = max(max_sum, curr_sum)  # actualizăm suma maximă dacă este cazul
                     max_sum = max(max_sum, curr_sum)  # actualizăm suma maximă dacă este cazul


     return max_sum  # returnăm suma maximă
     return max_sum  # returnăm suma maximă


# citim datele de intrare
n = int(input())
matrice = [list(map(int, input().split())) for _ in range(n)]
# afișăm suma maximă a unei submatrici
print(suma_maxima_submatrice(matrice))


if __name__ == '__main__':
    try:
        n = int(input("Introduceti numarul de linii/coloane: "))    # citirea numarului de linii si coloane
        matrice = [list(map(int, input().split())) for _ in range(n)]  # citirea matricei
        if verificare_restrictii(n, matrice):            # verificam datele de intrare
            print("Datele de intrare corespund restrictiilor impuse.")
            print(suma_maxima_submatrice(n, matrice))  # apelam functia de rezolvare
        else:
            print("Datele de intrare nu corespund restrictiilor impuse.")
    # ne asteptam la 2 tipuri de erori din cauza datelor de intrare, le tratam corespunzator
    except ValueError:
        print("Datele de intrare nu corespund restrictiilor impuse.")
    except IndexError:
        print("Datele de intrare nu corespund restrictiilor impuse.")


</syntaxhighlight>
</syntaxhighlight>


==Explicatie==
==Explicație==
; Submatricea de sumă maximă este:
 
: '''2 4 5'''
Submatricea de sumă maximă este:
: '''3 -2 6'''
:'''2 4 5'''
:'''3 -2 6'''

Latest revision as of 19:11, 13 November 2023

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

Cerință[edit | edit source]

Se dă o matrice de numere întregi cu n linii și n coloane. Să se determine suma maximă care se poate obține dintr-o submatrice.

Date de intrare[edit | edit source]

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

Date de ieșire[edit | edit source]

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

Restricții de precizări[edit | edit source]

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

Exemplul 1[edit | edit source]

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
Datele introduse corespund restricțiilor impuse.
18

Exemplul 2[edit | edit source]

Intrare
1x
Ieșire
Datele introduse nu corespund restricțiilor impuse.

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line="1" start="1">

def verificare_restrictii(numar, matrix): # functia de verificare a datelor de intrare

   if 1 <= numar <= 300 and all(-1000 <= element <= 1000 for rand in matrix for element in rand):
       return True
   else:
       return False


def suma_maxima_submatrice(numar, matrix):

   # inițializăm matricea de sume prefix cu 0
   prefix_sum = [[0 for _ in range(numar + 1)] for _ in range(numar + 1)]
   # calculăm matricea de sume prefix
   for i in range(numar):
       for j in range(numar):
           prefix_sum[i + 1][j + 1] = matrix[i][j] - prefix_sum[i][j] + prefix_sum[i][j + 1] + prefix_sum[i + 1][j]
   max_sum = float('-inf')  # inițializăm suma maximă cu -infinit
   # parcurgem toate submatricile posibile
   for i in range(1, numar + 1):
       for j in range(1, numar + 1):
           for k in range(i, numar + 1):
               for lenght in range(j, numar + 1):
                   # calculăm suma submatricei curente folosind sumele prefix
                   curr_sum = prefix_sum[k][lenght] - prefix_sum[k][j - 1] - prefix_sum[i - 1][lenght] + prefix_sum[i - 1][j - 1]
                   max_sum = max(max_sum, curr_sum)  # actualizăm suma maximă dacă este cazul
   return max_sum  # returnăm suma maximă


if __name__ == '__main__':

   try:
       n = int(input("Introduceti numarul de linii/coloane: "))     # citirea numarului de linii si coloane
       matrice = [list(map(int, input().split())) for _ in range(n)]  # citirea matricei
       if verificare_restrictii(n, matrice):             # verificam datele de intrare
           print("Datele de intrare corespund restrictiilor impuse.")
           print(suma_maxima_submatrice(n, matrice))  # apelam functia de rezolvare
       else:
           print("Datele de intrare nu corespund restrictiilor impuse.")
   # ne asteptam la 2 tipuri de erori din cauza datelor de intrare, le tratam corespunzator
   except ValueError:
       print("Datele de intrare nu corespund restrictiilor impuse.")
   except IndexError:
       print("Datele de intrare nu corespund restrictiilor impuse.")

</syntaxhighlight>

Explicație[edit | edit source]

Submatricea de sumă maximă este:

2 4 5
3 -2 6