Quindi l'ho fatto in un modo strano. Ho notato che c'erano due modelli nel modo in cui l'array si forma.
Il primo è come il modello delle righe superiori ha la differenza tra ogni termine che aumenta da 1 -> h dove h è l'altezza e l è la lunghezza. Quindi costruisco la riga superiore in base a quel modello
Per una matrice di dim (3,4) che dà un max RoC = 3
Vedremo la prima fila del modulo
1, (1+1), (2+2), (4+3) = 1, 2, 4, 7
Supponiamo invece che il dim (3,9) che dà un max RoC = 3
vedremo invece una riga superiore di
`1, (1+1), (2+2), (4+3), (7+3), (10+3), (13+3), (16+3), (19+3) = 1, 2, 4, 7, 10, 13, 16, 19, 22
Il secondo modello è come le righe cambiano l'una dall'altra. Se consideriamo la matrice:
1 2 4 7 11
3 5 8 12 16
6 9 13 17 20
10 14 18 21 23
15 19 22 24 25
e sottrarre ogni riga dalla riga sottostante (ignorando la riga aggiuntiva) che otteniamo
2 3 4 5 5
3 4 5 5 4
4 5 5 4 3
5 5 4 3 2
Vedendo questa matrice possiamo notare che questa matrice è la sequenza in 2 3 4 5 5 4 3 2
cui per ogni riga è 5 termini di questo modello spostato di 1 per ogni riga. Vedi sotto per visual.
|2 3 4 5 5| 4 3 2
2 |3 4 5 5 4| 3 2
2 3 |4 5 5 4 3| 2
2 3 4 |5 5 4 3 2|
Quindi per ottenere la matrice finale prendiamo la nostra prima riga che abbiamo creato e prodotto quella riga aggiunta con i 5 termini necessari di questo modello.
Questo modello avrà sempre le caratteristiche di inizio 2-> max value
e fine in max value -> 2
cui il max value = min(h+1, l)
e il numero di volte in cui apparirà il valore massimo è appearances of max = h + l -2*c -2
dovec = min(h+1, l) - 2
Quindi nel complesso il mio metodo per creare nuove righe sembra
1 2 3 7 11 + |2 3 4 5 5|4 3 2 = 3 5 8 12 16
3 5 8 12 16 + 2|3 4 5 5 4|3 4 2 = 6 9 13 17 20
6 9 13 17 20 + 2 3|4 5 5 4 3|4 2 = 10 14 18 21 23
10 14 18 21 23 + 2 3 4|5 5 4 3 2| = 15 19 22 24 25
Codice pertinente di seguito. Non è finito per essere breve ma mi piace ancora il metodo.
o,r=len,range
def m(l,h):
a,t=[1+sum(([0]+[x for x in r(1,h)]+[h]*(l-h))[:x+1]) for x in r(l)],min(l,h+1);s,c=[x for x in r(2,t)],[a[:]]
for i in r(h-1):
for j in r(o(a)):
a[j]+=(s+[t]*(l+h-2*(t-2)-2)+s[::-1])[0+i:l+i][j]
c+=[a[:]]
for l in c:print(l)
Provalo online!