Я хотел изучить другие проблемы на практике DP (динамическое программирование).Я нашел это для проблемы лестницы, которая похожа на последовательность Фибоначчи.Тем не менее код, за которым я следовал, похоже, не совпадал с суммой предварительно вычисленного кэша.
Насколько я понял, это из блогов Daily Programming Challenges , говорящих о том, каконо работает.Фрагмент кода, который они используют, - это Pythonic, используя понимание списка.Я уже выполнил свою часть, но я хотел сравнить, как их решение может быть лучше моего, используя функцию sum
и взяв дополнительную переменную в аргументе функции.
Вот сводка: КаждоеКэш записей [i] будет содержать количество способов, которыми мы можем добраться до шага i с набором X. Затем мы построим массив с нуля, используя ту же повторяемость, что и раньше:
Этоэто их пример кода
def staircase(n, X):
cache = [0 for _ in range(n + 1)]
cache[0] = 1
for i in range(n + 1):
cache[i] += sum(cache[i - x] for x in X if i - x > 0)
cache[i] += 1 if i in X else 0
return cache[-1]
Это мой пример кода:
def staircase_dp(n):
dp = [0 for i in range(n + 1)]
dp[0] = 1
dp[1] = 1
for i in range(2, n + 1):
val = dp[i - 1] + dp[i - 2]
dp.insert(i, val)
return dp[n]
Это мой основной код:
if __name__ == '__main__':
steps = 6
n = 2
print("Number of ways to use the stairs = {0}".format(staircase(steps, n))) #This will use the example from Daily Programming Challenge and gives TypeError message.
print("Number of ways to use the stairs = {0}".format(staircase_dp(steps))) #Mine which outputs 13
Для их примера, когда я пытаюсьраспечатайте его, и вы получите сообщение TypeError:
`Traceback (most recent call last):
File "staircase.py", line 44, in <module>
print("Number of ways to use the stairs = {0}".format(staircase_dp(steps, n)))
File "staircase.py", line 21, in staircase_dp
cache[i] = sum(cache[i - x] for x in X if i - x > 0)
TypeError: 'int' object is not iterable`
Однако для моего решения я просто создаю динамический массив от 0 до n.Как мы знаем, dp [0] и d [1] всегда будут давать значение 1. После второй итерации мы начнем вычислять большие числа и добавим их в другую переменную, которая содержит значения dp[i - 1] + dp[i - 2]
.Затем вставьте значение в стек dp
, который мы потом вернем.
Что я не совсем понимаю, потому что я просто пытаюсь добавить количество вычисленных шагов, выполненных вкеш и просто вернуть мне значение кеша.Это правильное мышление?