だから私はこれを奇妙な方法でやった。配列の形成方法には2つのパターンがあることに気付きました。
1つ目は、最上部の行パターンに、各項が1-> hから増加する差がある方法です。ここで、hは高さ、lは長さです。そのため、そのパターンに基づいて一番上の行を作成します
dim(3,4)の行列の場合max RoC = 3
、フォームの一番上の行が表示されます。
1, (1+1), (2+2), (4+3) = 1, 2, 4, 7
代わりにdim(3,9)を与えると、max RoC = 3
代わりに上の行が表示されます
`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
2番目のパターンは、行が互いにどのように変化するかです。マトリックスを考慮した場合:
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
下の行から各行を引きます(余分な行は無視します)
2 3 4 5 5
3 4 5 5 4
4 5 5 4 3
5 5 4 3 2
このマトリックスを見ると、このマトリックスは2 3 4 5 5 4 3 2
各行ごとにこのパターンの5項が1行ずつシフトしたシーケンスであることがわかります。視覚については以下を参照してください。
|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|
したがって、最終的なマトリックスを取得するには、作成した最初の行を取得し、このパターンに必要な5つの用語を追加した行を出力します。
このパターンには常に、最大値が表示される場所と回数が始まる場所2-> max value
と終了するmax value -> 2
場所の特性max value = min(h+1, l)
がappearances of max = h + l -2*c -2
あります。c = min(h+1, l) - 2
したがって、全体として、新しい行を作成する私の方法は次のようになります
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
以下の関連コード。最終的には短くなりませんでしたが、私はまだこの方法が好きです。
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)
オンラインでお試しください!