그래서 나는 이것을 이상한 방식으로했다. 배열이 형성되는 방식에 두 가지 패턴이 있음을 알았습니다.
첫번째 는 상단 행 패턴이 1-> h에서 증가하는 각 항 사이의 차이를 갖는 방법입니다. 여기서 h는 높이이고 l은 길이입니다. 그 패턴을 기반으로 상단 행을 구성합니다.
dim (3,4)의 행렬은 다음 max RoC = 3
과 같습니다.
1, (1+1), (2+2), (4+3) = 1, 2, 4, 7
대신에 max RoC = 3
우리 에게 dim (3,9)을 주면
`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)
온라인으로 사용해보십시오!