Код: Выделить всё
[[ 1, 1, -3, 0, 0, 3, -1, 3, -3, 2],
[-2, -1, 0, 1, 0, -2, 0, 0, 1, -3],
[ 2, 2, -3, 2, -2, -1, 2, 2, -2, 0],
[-2, 0, -3, 3, 0, 2, -1, 1, 3, 3],
[-1, -2, -1, 2, 3, 3, -3, -3, 2, 0],
[-3, 3, 2, 0, -3, -2, -1, -3, 0, -3],
[ 3, 2, 2, -1, 0, -3, 1, 1, -2, 2],
[-3, 1, 3, 3, 0, -3, -3, 2, -2, 1],
[ 0, -3, 0, 3, 2, -2, 3, -2, 3, 3],
[-1, 3, -3, -2, 0, -1, -2, -1, -1, 2]]
Существует также диагональная линия, которая может обрезать круг, как показано на рисунке. Диагональная линия всегда начинается и заканчивается в целочисленной координате на границе сетки и идет вниз и вправо под углом 45 градусов к горизонтали, как показано на рисунке.
Оценка за обрезанный круг — это сумма всех целых чисел, которые находятся как внутри круга (или на границе), так и на стороне диагональной линии, включая (0,0). Значения на границе (или рядом с ней): -3, 1, 3, -1, -3, 3, -1, 2, 0, 3.
Хотя круг может имеют любой радиус, нам нужно рассматривать только круги, которые точно пересекают точку сетки, чтобы существовало n ^ 2 различных соответствующих радиуса. Кроме того, нам нужно записать только одну позицию, где круг пересекается с диагональной линией, чтобы полностью указать обрезанный круг. Обратите внимание, что это пересечение с диагональю не обязательно должно происходить по целочисленной координате.
Если в оптимальном решении диагональ вообще не отсекает круг, то нам нужно только вернуть радиус. круга.
Если бы мы хотели найти только оптимальный круг, мы могли бы сделать это быстро и за время, пропорциональное входному размеру, с помощью:
Код: Выделить всё
import numpy as np
from math import sqrt
np.random.seed(40)
def find_max(A):
n = A.shape[0]
sum_dist = np.zeros(2 * n * n, dtype=np.int32)
for i in range(n):
for j in range(n):
dist = i**2 + j**2
sum_dist[dist] += A[i, j]
cusum = np.cumsum(sum_dist)
# returns optimal radius with its score
return sqrt(np.argmax(cusum)), np.max(cusum)
A = np.random.randint(-3, 4, (10, 10))
print(find_max(A))
Подробнее здесь: https://stackoverflow.com/questions/781 ... ped-circle