1972 - Hambar

From Bitnami MediaWiki

Enunț[edit | edit source]

Gigel are o grădina sub forma unei matrice binare de ordin N, unde 0 reprezintă teren liber, 1 reprezintă pomi. El dorește să construiască un hambar pe dreptunghiul de arie maximă format doar din 0.

Cerința[edit | edit source]

Ajutați-l pe Gigel să găsească dreptunghiul de arie maximă format doar din 0.

Date de intrare[edit | edit source]

Fișierul de intrare hambarin.txt conține pe prima linie numerele N și M, reprezentând dimensinunea matricei, respectiv numărul de pomi, iar pe următoarele M linii se vor găsi perechi numere x și y, separate printr-un spațiu, reprezentând indicele liniei, respectiv al coloanei pe care se află un pom.

Date de ieșire[edit | edit source]

Fișierul de ieșire hambarout.txt va conține pe prima linie numărul S, reprezentând aria maximă a unei suprafețe dreptunghiulare ce nu conține 1.

Restricții și precizări[edit | edit source]

  • 1 ≤ N, M ≤ 1000
  • Nu se vor afla 2 sau mai mulți pomi în același loc.

Exemplul 1[edit | edit source]

hambarin.txt
5 5
1 3
2 1
2 5
5 1
5 5
hambarout.txt
Datele introduse corespund restricțiilor impuse.
12

Exemplul 2[edit | edit source]

hambarin.txt
5 5
1 3
2 1
2 5
5 1
5 1000
hambarout.txt
Datele introduse nu corespund restricțiilor impuse.

Rezolvare[edit | edit source]

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

  1. 1972 - Hambar

def validare(dim_n1, dim_m1, lista_pomi1): # functia de validare a datelor de intrare

   if dim_n1 < 1 or dim_n1 > 1000 or dim_m1 < 1 or dim_m1 > 1000:
       raise ValueError
   for pom in lista_pomi1:
       if pom[0] < 1 or pom[0] > dim_n1 or pom[1] < 1 or pom[1] > dim_n1:
           raise ValueError
   fisier_iesire.write("Datele de intrare corespund restrictiilor impuse\n")


def arie_maxima(dim_n1, lista_pomi1): # functia de rezolvare

   matrice = [[0] * dim_n1 for _ in range(dim_n1)]
   for pom in lista_pomi1:
       matrice[pom[0]-1][pom[1]-1] = 1
   dp = [[0] * dim_n1 for _ in range(dim_n1)]
   max_area = 0
   for i in range(dim_n1):
       for j in range(dim_n1):
           if matrice[i][j] == 0:
               dp[i][j] = dp[i-1][j] + 1 if i > 0 else 1
   for i in range(dim_n1):
       for j in range(dim_n1):
           width = dp[i][j]
           for k in range(i, -1, -1):
               width = min(width, dp[k][j])
               max_area = max(max_area, width * (i-k+1))
   fisier_iesire.write(str(max_area))


if __name__ == '__main__':

   fisier_intrare = open("hambarin.txt", "r")         # declararea fisierelor
   fisier_iesire = open("hambarout.txt", "w")       # fisierul out trebuie declarat cu optiunea "w" (write)
   try:
       dim_n, dim_m = map(int, fisier_intrare.readline().split())
       lista_pomi = [list(map(int, fisier_intrare.readline().split())) for _ in range(dim_m)]
       validare(dim_n, dim_m, lista_pomi)                 # apelul functiei de validare
       arie_maxima(dim_n, lista_pomi)               # apelul functiei de rezolvare
   except ValueError:
       fisier_iesire.write("Datele de intrare nu corespund restrictiilor impuse")

</syntaxhighlight>