2429 - matrice9: Diferență între versiuni

De la Universitas MediaWiki
Linia 47: Linia 47:


== Rezolvare ==
== Rezolvare ==
#2429 - matrice9
<syntaxhighlight lang="python"line>
<syntaxhighlight lang="python"line>


def este_sir_valid(sir):
def este_sir_valid(sir):
     n = len(sir)
     # Verifică dacă un șir este valid conform definiției date
     crescator = all(sir[i] < sir[i + 1] for i in range(n - 1))
     # Puteți implementa această funcție în funcție de specificațiile exacte ale problemei
    descrescator = all(sir[i] > sir[i + 1] for i in range(n - 1))
    return crescator or descrescator


def aria_maxima_submatrice_valida(matrice):
def este_submatrice_valida(matrice, l1, c1, l2, c2):
     n = len(matrice)
     # Verifică dacă o submatrice este validă conform definiției date
     m = len(matrice[0])
    # Parcurge liniile submatricei și verifică dacă fiecare linie este un șir valid
    for i in range(l1, l2 + 1):
        linie_submatrice = matrice[i][c1:c2 + 1]
        if not este_sir_valid(linie_submatrice):
            return False
    return True
 
def calculeaza_aria_submatrice(matrice, l1, c1, l2, c2):
    # Calculează aria unei submatrice
     return (l2 - l1 + 1) * (c2 - c1 + 1)
 
def gaseste_submatrice_maxima(matrice):
    # Găsește și returnează submatricea de dimensiuni maxime care este validă
     max_aria = 0
     max_aria = 0
    coordonate_maxime = None


     for i in range(n):
     for l1 in range(len(matrice)):
         for j in range(m):
         for c1 in range(len(matrice[0])):
            sir_linie = [matrice[i][k] for k in range(j, m)]
             for l2 in range(l1, len(matrice)):
            submatrice_aria = 0
                 for c2 in range(c1, len(matrice[0])):
 
                    if este_submatrice_valida(matrice, l1, c1, l2, c2):
             for h in range(i, n):
                        aria = calculeaza_aria_submatrice(matrice, l1, c1, l2, c2)
                 sir_linie = [matrice[h][k] for k in range(j, m)]
                        if aria > max_aria:
                if este_sir_valid(sir_linie):
                            max_aria = aria
                    submatrice_aria += len(sir_linie)
                            coordonate_maxime = (l1, c1, l2, c2)
                    max_aria = max(max_aria, submatrice_aria)
                else:
                    break


     return max_aria
     return coordonate_maxime


<syntaxhighlight>
<syntaxhighlight>

Versiunea de la data 14 decembrie 2023 11:00

Cerinta

Se cere să se găsească o submatrice validă a lui A de arie maximă.

Date de intrare

Fișierul de intrare matrice9.in conține pe prima linie numerele N şi M, separate prin spaţiu. Pe fiecare dintre următoarele N linii se află câte M numere întregi separate prin câte un spaţiu, reprezentând elementele matricei A.

Date de iesire

Fișierul de ieșire matrice9.out va conţine o singură linie pe care vor fi scrise coordonatele l1, c1, l2, c2 (în această ordine şi separate prin câte un spaţiu) ale unei submatrice valide de arie maximă. În cazul în care există mai multe soluţii cu arie maximă, se va afişa oricare dintre ele.

Restrictii si precizari

  • 1 ≤ N, M ≤ 1000
  • 70% din teste vor avea N, M ≤ 600
  • Elementele matricei A sunt numere întregi din intervalul [-30000, 30000].

Exemplul 1

intrare
2 6
1 2 5 7 9 10
3 4 3 5 1 10
iesire
Datele introduse corespund restrictiilor impuse.
1 1 2 3

Exemplul 2

intrare
3 7
2 3 6 8 10 11
4 5 4 6 2 11
iesire
Datele de intrare nu corespund restrictiilor impuse

Rezolvare

  1. 2429 - matrice9

<syntaxhighlight lang="python"line>

def este_sir_valid(sir):

   # Verifică dacă un șir este valid conform definiției date
   # Puteți implementa această funcție în funcție de specificațiile exacte ale problemei

def este_submatrice_valida(matrice, l1, c1, l2, c2):

   # Verifică dacă o submatrice este validă conform definiției date
   # Parcurge liniile submatricei și verifică dacă fiecare linie este un șir valid
   for i in range(l1, l2 + 1):
       linie_submatrice = matrice[i][c1:c2 + 1]
       if not este_sir_valid(linie_submatrice):
           return False
   return True

def calculeaza_aria_submatrice(matrice, l1, c1, l2, c2):

   # Calculează aria unei submatrice
   return (l2 - l1 + 1) * (c2 - c1 + 1)

def gaseste_submatrice_maxima(matrice):

   # Găsește și returnează submatricea de dimensiuni maxime care este validă
   max_aria = 0
   coordonate_maxime = None
   for l1 in range(len(matrice)):
       for c1 in range(len(matrice[0])):
           for l2 in range(l1, len(matrice)):
               for c2 in range(c1, len(matrice[0])):
                   if este_submatrice_valida(matrice, l1, c1, l2, c2):
                       aria = calculeaza_aria_submatrice(matrice, l1, c1, l2, c2)
                       if aria > max_aria:
                           max_aria = aria
                           coordonate_maxime = (l1, c1, l2, c2)
   return coordonate_maxime

<syntaxhighlight>