Я предполагаю, что "оптимальный путь" определяется как путь с наибольшей суммой?
Вы можете использовать динамическое программирование. Для каждой строки установите для элементов этой строки оптимальное значение пути, заканчивающееся в этой строке. Итак
solution[i][j] = grid[i][j] + max(solution[i-1][j], solution[i-1][j-1], solution[i-1][j+1])
с учетом граничных условий конечно. Начальные условия будут:
solution[0][j] = grid[0][j]
Вам также необходимо отслеживать фактический пройденный путь (какие элементы сетки выбраны) по оптимальному пути. Как только вы доберетесь до последнего ряда, пройдите через ряд и найдите максимальное значение. Это даст вам оптимальный путь и его ценность.