Я думаю, что эту проблему можно решить с помощью динамического программирования. Мы могли бы использовать dp[i,j]
для вычисления наилучшего количества баллов, которое вы можете получить, перейдя из правого нижнего угла в положение i,j
. Мы можем вычислить dp[i,j]
для действительного i,j
на основе dp[i+1,j]
, dp[i,j+1]
и dp[i+1,j+1]
, если это действительные позиции (не из матрицы или помечены как x
), и суммировать их полученный в ячейке i,j
. Вы должны начать вычисления с нижнего правого угла до левого верхнего, построчно и начиная с последнего столбца.
Для количества способов вы можете добавить новую матрицу ways
и использовать ее для хранения количества способов.
Это пример кода, демонстрирующий идею:
dp[i,j] = dp[i+1,j+1] + board[i,j]
ways[i,j] = ways[i+1,j+1]
if dp[i,j] < dp[i+1,j] + board[i,j]:
dp[i,j] = dp[i+1,j] + board[i,j]
ways[i,j] = ways[i+1,j]
elif dp[i,j] == dp[i+1,j] + board[i,j]:
ways[i,j] += ways[i+1,j]
# check for i,j+1
Это при условии, что все позиции действительны.
Окончательный результат сохраняется в dp[0,0]
и ways[0,0]
.