Проблема с напоминанием - проблема дома грабителя

При обработке вашего действия вы возвращаете объект (проверяйте фигурные скобки):

return {
  ...state,
  sidebarname: action.payload
};

Поскольку ваше полное состояние - это только строка sidebarname, вы должны вернуть только полезную нагрузку:

return action.payload

В качестве альтернативы вы можете указать свое состояние как объект, а затем действие вашего действия должно работать нормально:

let initialState = { sidebarmenu: "wrapper slide-menu" };
...
export default function(state=initialState,action){
  ...
}
3
задан Abhishek 20 January 2019 в 00:38
поделиться

2 ответа

helper можно вызывать с другим параметром value для одного и того же index. Таким образом, value должно быть удалено (вычтено из сохраненного max_dict). Один из способов сделать это - добавить value непосредственно перед возвращением, а не раньше:

money = [2, 1, 1, 2]

max_dict = {}
def helper(value, index):

    if index in max_dict:
        return value + max_dict[index]

    elif index >= len(money):

        return value

    else:
        option1 = money[index]
        new_index1 = index + 2

        option2 = 0
        new_index2 = index + 1

        max_dict[index] = max(helper(option1, new_index1), helper(option2, new_index2))

        return value + max_dict[index]


helper(0, 0)

Более подробное объяснение того, что происходит, дается в ответе @ ggorlen

.
0
ответ дан Michael Butscher 20 January 2019 в 00:38
поделиться

Ваш подход к запоминанию не будет работать, потому что, когда вы достигнете некоторого индекса i, если вы уже вычислили какой-то результат для i, ваш алгоритм не учитывает тот факт, что может быть лучше Результат можно получить, ограбив более оптимальный набор домов в левой части массива.

Решение этой дилеммы состоит в том, чтобы не пропускать бегущую value (деньги, которые вы ограбили) вниз через рекурсивные звонки от родителей к детям. Идея состоит в том, чтобы вычислить результаты подзадачи без какого-либо ввода от узлов-предков, а затем построить более крупные решения из меньших по пути к стеку вызовов.

Затем будет работать запоминание индекса i, поскольку данный индекс i всегда будет иметь уникальный набор подзадач, решения которых не будут искажены при выборе из предков в левой части массива. Это сохраняет оптимальную подструктуру, необходимую для работы DP.

Кроме того, я рекомендую избегать глобальных переменных в пользу передачи ваших данных непосредственно в функцию.

def maximize_robberies(houses, memo, i=0):
    if i in memo:
        return memo[i]
    elif i >= len(houses):
        return 0

    memo[i] = max(
        houses[i] + maximize_robberies(houses, memo, i + 2),
        maximize_robberies(houses, memo, i + 1)
    )
    return memo[i]


print(maximize_robberies([1, 2, 1, 1], {}))

Попробуйте!

0
ответ дан ggorlen 20 January 2019 в 00:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: