Локальное оптимальное решение, представленное Китом, на самом деле не будет работать за линейное время.Проблема в том, что он не может гарантировать, что длина пути равна O (n).
Однако подумайте, что произойдет, если вы посмотрите на все дома в среднем ряду и колонке.В частности, подумайте, как вы могли бы использовать это в этом, чтобы помочь вашему локальному решению optima.
(Полное решение не предусмотрено, потому что, ну, это назначение) Тем не менее, действительно изящная проблема.Слава его создателю.
[РЕДАКТИРОВАТЬ: Подсказка]
Ранее предлагаемое решение не работает в таких случаях:
X.XXX.XXX.X
X.X.X.X.X.X
X.X.X.X.X.X
X.X.X.X.X.X
XXX.XXX.XXX
где.это действительно небольшое потребление электроэнергии, и x медленно увеличивают потребление электроэнергии.
Что произойдет, если мы запросим средний ряд?
X.XXX.XXX.X
X.X.X.X.X.X
&&&&&&&&&&&
X.X.X.X.X.X
XXX.XXX.XXX
Где находится дом, на который мы смотрели.Нам удалось прорезать путь.Если бы мы начали восхождение на гору в лучшем месте, которое мы нашли, мы смогли бы избежать долгого пути.(Но мы все еще не можем гарантировать, что путь достаточно короткий)
[РЕДАКТИРОВАТЬ: Второй совет]
Сканирование среднего ряда, как упоминалось.Возьмите самое большое значение.Переместитесь вверх или вниз к большему значению (если вы не можете, то эта ячейка сетки является локальной оптимой, и все готово).Теперь рассмотрим путь увеличения ценностей.Невозможно, чтобы путь снова мог пересечь эту среднюю строку, поскольку все значения в этой строке должны быть меньше текущей ячейки.(Поскольку текущая ячейка должна быть больше, чем наибольшее из значений в строке).Это означает, что мы существенно уменьшили проблему в два раза.