Also habe ich das auf seltsame Weise gemacht. Mir ist aufgefallen, dass das Array zwei Muster aufweist.
Das erste ist, wie das Muster der oberen Reihen den Unterschied zwischen jedem Term hat, der von 1 -> h zunimmt, wobei h die Höhe und l die Länge ist. Also konstruiere ich die oberste Reihe basierend auf diesem Muster
Für eine Matrix von dim (3,4), die a ergibt, sehen max RoC = 3
wir die oberste Zeile des Formulars
1, (1+1), (2+2), (4+3) = 1, 2, 4, 7
Nehmen wir stattdessen an, dass das dim (3,9), das a max RoC = 3
ergibt, stattdessen eine obere Reihe von ergibt
`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
Das zweite Muster ist, wie sich die Zeilen voneinander ändern. Wenn wir die Matrix betrachten:
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
und subtrahiere jede Zeile von der darunter liegenden Zeile (ignoriere die zusätzliche Zeile), die wir erhalten
2 3 4 5 5
3 4 5 5 4
4 5 5 4 3
5 5 4 3 2
Wenn wir diese Matrix sehen, können wir feststellen, dass diese Matrix die Sequenz ist, 2 3 4 5 5 4 3 2
bei der um jede Zeile 5 Terme dieses Musters für jede Zeile um 1 verschoben sind. Siehe unten für visuelle.
|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|
Um die endgültige Matrix zu erhalten, nehmen wir unsere erste Zeile und geben die Zeile aus, die mit den 5 benötigten Begriffen dieses Musters hinzugefügt wurde.
Dieses Muster wird immer die Eigenschaften der Anfang 2-> max value
und das Ende , max value -> 2
wo die max value = min(h+1, l)
und die Anzahl der Male , dass der maximale Wert angezeigt ist , appearances of max = h + l -2*c -2
woc = min(h+1, l) - 2
Insgesamt sieht meine Methode zum Erstellen neuer Zeilen also so aus
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
Relevanter Code unten. Es war zwar nicht kurz, aber ich mag die Methode trotzdem.
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)
Probieren Sie es online!