Я предлагаю вам переформулировать свое обратное отслеживание, чтобы использовать динамическое программирование, чтобы обрезать дерево обратной трассировки. Вот логика, которую я предлагаю ее спроектировать:
При принятии решения о том, хотите ли вы или нет изменить ячейку, на самом деле не имеет значения, как вы назначили предыдущие ячейки, это имеет значение только для накопленной стоимости, поэтому вы можете сохранить трек для каждой ячейки и каждая возможная накопленная стоимость, что было минимальным результатом, уже найденным. Таким образом, когда вы снова найдете ту же конфигурацию, вы сохраните ответ.
Так что ваша дп матрица будет что-то вроде:
dp[top_bound][n][n];
И прежде чем делать возвраты вы должны сделать:
if(dp[acc_cost][this_i][this_j] != -1)
return dp[acc_cost][this_i][this_j];
// Perform your calculations
// ...
dp[acc_cost][this_i][this_j] = result;
return result;
Здесь я предполагаю, что -1
является недопустимым значением в результате, если не вы просто выбираете какое-либо недопустимое значение и инициализируете свою матрицу. Поскольку эта матрица имеет размер n * n * top_bound, тогда правильно реализованный DP должен решить проблему в O (n * n * top_bound).
Вы ищете оптимальное решение? Или можно сделать для эвристики? Кажется, что Gentic Algorithms и/или Hill Climbing могут привести к приличному результату быстро \ – amit
@fordprefect. Для того, чтобы проблема имела смысл, она должна быть меньше 4b, так как 4b - это максимальная стоимость, которую вы можете избежать, меняя ячейку. Изменить: Упс, ниндзя. Хорошо, оставив это здесь. –
@Jack Newton вы могли бы предоставить любое изображение двоичной матрицы. Как матрица состоит из 4 соседей вместо 8? –