所以我这样做很奇怪。我注意到数组形成的方式有两种模式。
第一个是顶部行模式如何使每个项之间的差从1-> h增加,其中h是高度,l是长度。所以我根据该模式构造了第一行
对于dim(3,4)给出的矩阵,max RoC = 3
我们将看到表格的第一行
1, (1+1), (2+2), (4+3) = 1, 2, 4, 7
假设给定a的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
第二种模式是行如何彼此改变。如果考虑矩阵:
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)
在线尝试!