В последней части (при обходе в обратном направлении) у вас есть небольшая ошибка:
for i in range(len(h)-2, -1, -1):
if h[i]>=h[i+1] and dp[i]<=dp[i+1]:
dp[i] = dp[i+1]
должно быть:
for i in range(len(h)-2, -1, -1):
if h[i]>h[i+1] and dp[i]<=dp[i+1]:
dp[i] = dp[i+1] + 1
Проблема здесь в том, что у пациента больше здоровьяно имеет меньшее (или такое же) количество таблеток. В первом случае ваше состояние верно, но вы не решаете проблему. Во втором случае вы проверяете, есть ли у пациента больше таблиц.
Не имеет значения, чтобы получить правильный ответ, я бы предложил еще одно улучшение, заменив их:
dp = [0] * len(h)
dp[0] = 1
for i in range(1, len(h)):
if h[i] > h[i-1]:
dp[i] = dp[i-1] + 1
else:
dp[i] = 1
на эти:
dp = [1] * len(h)
for i in range(1, len(h)):
if h[i] > h[i-1]:
dp[i] = dp[i-1] + 1
Поскольку мы знаем, что каждый пациент получит как минимум 1 таблетку.
Обновление: Вот пример случая, когда ваш первыйкод потерпит неудачу:
h = [10, 10, 1]
Ваш код будет рассчитывать dp = [1, 1, 1]