LSBRA(X,Y)
означает «Самый большой квадрат с правым нижним углом в X, Y»
псевдокод:
LSBRA(X,Y):
if (x,y) == 0:
0
else:
1+MIN( LSBRA(X-1,Y), LSBRA(X,Y-1), LSBRA(X-1,Y-1) )
(Для краевых ячеек вы можете пропустить часть MIN и просто вернуть 1, если (x, y) не равно 0.)
Работайте по диагонали через сетку в «волнах», как показано ниже:
0 1 2 3 4
+----------
0 | 1 2 3 4 5
1 | 2 3 4 5 6
2 | 3 4 5 6 7
3 | 4 5 6 7 8
или, альтернативно, работайте слева направо, сверху вниз, пока вы заполняете краевые ячейки.
0 1 2 3 4
+----------
0 | 1 2 3 4 5
1 | 6 7 8 9 .
2 | . . . . .
3 | . . . . .
Таким образом, вы никогда не столкнетесь с вычислениями, в которых вы ранее не вычисляли необходимые данные - поэтому все «вызовы» LSBRA()
на самом деле являются просто поисками таблиц ваших предыдущих результатов вычислений (отсюда и аспект динамического программирования) ).
Почему это работает
Чтобы иметь квадрат с правым нижним углом в X, Y - он должен содержать перекрывающиеся квадраты одного меньшего измерения, которые касаются каждого из трех других углов. Другими словами, иметь
XXXX
XXXX
XXXX
XXXX
у тебя тоже должно быть ...
XXX. .XXX .... ....
XXX. .XXX XXX. ....
XXX. .XXX XXX. ....
.... .... XXX. ...X
Пока у вас есть эти 3 (каждый из проверок LSBRA) квадратов N-размера плюс текущий квадрат также "занят", у вас будет квадрат (N + 1) размера.