Вы можете использовать другой двумерный массив std::pair
для хранения индексов пути, выбранного для достижения оптимального решения.
Восстановление решения
- Для восстановлениярешение, объявите
path
для хранения последнего пути, выбранного для достижения оптимального решения.
std::pair<int,int> path[M][N]
В вашем внутреннем цикле вычисляется каждый раз T[i][j]
, также вычисляется path[i][j]
if (i == 0 && j > 0) {
T[0][j] += T[0][j - 1];
path[0][j] = std::make_pair(0, j - 1);
}
else if (j == 0 && i > 0) {
T[i][0] += T[i - 1][0];
path[i][0] = std::make_pair(i - 1, 0);
}
else if (i > 0 && j > 0) {
if (T[i - 1][j] < T[i][j - 1]) {
T[i][j] += T[i - 1][j];
path[i][j] = std::make_pair(i - 1, j);
} else {
T[i][j] += T[i][j - 1];
path[i][j] = std::make_pair(i, j - 1);
}
}
Наконец, используя массив path
, реконструируйте решение, используярекурсивная функция выглядит следующим образом (ее также можно преобразовать в итеративное решение)
void printPath(int i, int j, std::pair<int,int> path[M][N], int cost[M][N])
{
if (!i && !j) {
cout << cost[i][j] << ' ';
return;
}
printPath(path[i][j].first, path[i][j].second, path, cost);
cout << cost[i][j] << ' ';
}
Демо: здесь