Рассмотрим двумерную сетку m*n, в которой каждая ячейка может содержать либо 1, либо 0. Найдите наибольшее значение, которое может получить обход, перемещаясь по этой сетке. Значение можно увеличить, пройдя по диагонали через 1 ячейку. Обход сетки подчиняется следующим правилам:
- Начните с верхней левой ячейки.
- В каждой ячейке обход может двигаться вниз на одну сетку, перемещаться на одну сетку вправо или двигаться по диагонали (перемещаться на одну сетку вниз и двигаться на одну сетку вправо). Если ячейка содержит 1 и обход движется по диагонали, то значение обхода увеличивается на 1.
- Обход не может выйти за пределы сетки (если на правом краю нельзя двигаться вправо, если на нижнем краю нельзя двигаться вниз).
- Конец в правом нижнем углу.
Наивный алгоритм рассмотрит все 3*m*n обходов и выберет наибольшее значение. Может ли кто-нибудь помочь мне найти лучшее решение? Есть ли алгоритм, решающий подобную задачу?
Это не вопрос интервью, мне нужно это, чтобы попытаться оптимизировать алгоритм Смита-Уотермана.
Примеры:
Следующая сетка имеет максимальное значение 2:
Этот имеет максимальное значение 7:
f(x,y)
будет максимальным значением пути, который заканчивается в ячейке(x,y)
. Его можно вычислить из значенийf(x-1,y)
,f(x,y-1)
иf(x,y)
, поэтому его можно решить вO(n*m)
, что кажется оптимальным, поскольку это размер ввода. - person Niklas B.   schedule 09.03.2014