3438 - Triunghi 5
Se consideră A un tablou bidimensional cu n linii, n coloane și elemente numere naturale. O zonă triunghiulară a tabloului, reprezentată de tripletul (lin, col, k), este o zonă de forma unui triunghi dreptunghic cu catetele de lungime egală cu |k|, definită astfel:
- Pentru
k>0, zona este compusă dinklinii:- pe prima linie a zonei se află elementele
A[lin][col],A[lin][col+1], …,A[lin][col+k-1]; - pe a doua linie a zonei se află elementele
A[lin+1][col],A[lin+1][col+1], …,A[lin+1][col+k-2]; - pe a treia linie a zonei se află elementele
A[lin+2][col],A[lin+2][col+1], …,A[lin+2][col+k-3]; - …
- pe ultima linie a zonei se află elementul
A[lin+k-1][col].
- pe prima linie a zonei se află elementele
- Pentru
k<0, zona este compusă din|k|=-klinii:- pe prima linie a zonei se află elementul
A[lin-|k|+1][col]; - pe a doua linie a zonei se află elementele
A[lin-|k|+2][col-1],A[lin-|k|+2][col]; - …
- pe ultima linie a zonei se află elementele
A[lin][col-|k|+1],A[lin][col-|k|+2],…,A[lin][col].
- pe prima linie a zonei se află elementul
Suma elementelor ce compun o zonă triunghiulară se numește suma zonei.
Cerința
Scrieţi un program care, cunoscând tabloul A şi Q zone triunghiulare, determină cea mai mare dintre sumele zonelor.
Date de intrare
Fișierul de intrare triunghi.in conține pe prima linie numărul natural n, cu semnificaţia din enunţ. Pe următoarele n linii se găsesc câte n valori naturale, reprezentând elementele tabloului A. Pe linia n+2 se află numărul natural Q, reprezentând numărul zonelor triunghiulare. Pe următoarele Q linii se găsesc tripletele de valori lin col k, care reprezintă cele Q zone, în forma descrisă în enunţ. Valorile aflate pe aceeaşi linie a fişierului sunt separate prin câte un spațiu.
Date de ieșire
Fișierul de ieșire triunghi.out va conține o singură linie pe care va fi scris un număr natural reprezentând suma maximă cerută.
Restricții și precizări
3 ≤ n ≤ 1000;1 ≤ Q ≤ 100000;2 ≤ |k| ≤ n- Valorile din tablou sunt numere naturale din intervalul
[1,100]. - Liniile şi coloanele tabloului
Asunt numerotate de la1lan(liniile de sus în jos, iar coloanele de la stânga la dreapta). |k|reprezintă modulul număruluik(k, pentruk≥0, respectiv-k, pentruk<0).- Se garantează că orice zonă triunghiulară dintre cele
Qeste complet inclusă în tabloulA.
Exemplu:
triunghi.in
6 5 8 10 4 9 4 2 10 10 2 4 8 8 10 3 4 6 6 4 6 9 7 1 9 6 7 2 2 10 6 10 4 6 1 10 4 3 4 1 3 4 4 -4 6 5 -2
triunghi.out
59
Explicație
Zona triunghiulară de sumă maximă (59) este reprezentată de tripletul (4 4 -4) și conține
valorile evienţiate: 59=4+(10+2)+(10+3+4)+(4+6+9+7).
<syntaxhighlight lang="python" line="1"> def suma_zona_triunghiulara(A, lin, col, k):
suma = 0
n = len(A)
if k > 0:
# Zona triunghiulară pentru k > 0
for i in range(k):
for j in range(k - i):
suma += A[lin + i][col + j]
else:
# Zona triunghiulară pentru k < 0
k = -k
for i in range(k):
for j in range(i + 1):
suma += A[lin - i + (k - 1)][col - j + (k - 1)]
return suma
def cea_mai_mare_suma(A, interogari):
max_suma = float('-inf')
for (lin, col, k) in interogari:
suma = suma_zona_triunghiulara(A, lin, col, k)
if suma > max_suma:
max_suma = suma
return max_suma
- Citire date
n = int(input()) A = [list(map(int, input().split())) for _ in range(n)] Q = int(input()) interogari = [tuple(map(int, input().split())) for _ in range(Q)]
- Calculare cea mai mare sumă
result = cea_mai_mare_suma(A, interogari) print(result) </syntaxhighlight>