Задача на ДП. Не понимаю в чем ошибка

Сдать решение задачи E-Кузнечик и лягушки Полный балл: 100 Ограничение времени: 2 с Ограничение реального времени: 5 с Ограничение памяти: 256M Задача E: Кузнечик и лягушки Условие задачи (pdf)

Кузнечик прыгает по столбикам, расположенным на одной линии на равных расстояниях друг от друга. Столбики имеют порядковые номера от 1 до N . В начале Кузнечик сидит на столбике с номером 1. Он может прыгнуть вперед на расстояние от 1 до K столбиков, считая от текущего.

На некоторых столбиках сидят лягушки, которые едят кузнечиков (Кузнечик не должен попадать на эти столбики!). Определите, сколькими способами Кузнечик может безопасно добраться до столбика с номером N. Учитывайте, что Кузнечик не может прыгать назад. Формат входных данных Входная строка содержит натуральные числа N и K, разделённые пробелом. Гарантируется, что 1≤N,K≤32. Во второй строке записано число лягушек L (0≤L≤N−2). В третьей строка записано L натуральных чисел: номера столбиков, на которых сидят лягушки (среди них нет столбиков с номерами 1 и N).

Примеры
Входные данные
6 4
2
2 4
Выходные данные
3

Не понимаю в чем ошибка не все тесты проходит

n, k = map(int, input().split())
l = int(input())
s_l = list(map(int, input().split()))
dp = [1] * n
dp_1 = []
for i in range(l):
    dp[s_l[i] - 1] = 0
dp_1 = []
dp_1.append(dp[0])
print(dp)
for i in range(1,n):
    if dp[i] == 0:
        pass
    else:
        if i < k:
            dp_1.append(sum(dp_1[:i]))
        else:
            dp_1.append(sum(dp_1[i - k:i]))
print(dp_1[-1])

Ответы (1 шт):

Автор решения: MBo

В dp1 вы не добавляете столбики с лягушками, а значит, будет сбиваться подсчёт по диапазону - i - k будет захватывать более ранние столбики, чем нужно

if dp[i] == 0:
    dp_1.append(0)

P.S. собственно, зачем dp1 нужен вообще?

n, k = map(int, input().split())
l = int(input())
s_l = list(map(int, input().split()))
dp = [1] * n
for i in range(l):
    dp[s_l[i] - 1] = 0
for i in range(1,n):
    if dp[i]:
        if i < k:
            dp[i] = sum(dp[:i])
        else:
            dp[i] = sum(dp[i - k:i])
print(dp[-1])

Следующий шаг, если понадобится оптимизация для больших N (для N=32 можно обойтись) - отказаться от суммирования каждый раз, и находить сумму диапазона через разность накопленных (кумулятивных) сумм.

Для этого по ходу дела суммируем полученные значения dp[] в дополнительный список cumsum[]

cumsum[i] = cumsum[i-1] + dp[i]

а сумма sum(dp[i - k:i]) равна разности cumsum[i-1] -cumsum[i-k-1].

Но более того - в данном случае и отдельный список не нужен. Просто складываем полученные значения, и отнимаем значения с левого конца интервала (пишу прямо здесь, индексы нужно проверить поточнее)

 dp[i] = partsum
 partsum  += dp[i]
 if i >= k:
    partsum -= dp[i-k-1]
  
→ Ссылка