Питон 18 !
кузнечик прыгает по столбикам, расположенным на одной линии на равных расстояниях друг от друга. столбики имеют порядковые номера от 1 до n . в начале кузнечик сидит на столбике с номером 1. он может прыгнуть вперед на расстояние от 1 до k столбиков, считая от текущего.
на каждом столбике кузнечик может получить или потерять несколько золотых монет (для каждого столбика это число известно). определите, как нужно прыгать кузнечику, чтобы собрать наибольшее количество золотых монет. учитывайте, что кузнечик не может прыгать назад.
входные данные
в первой строке вводятся два натуральных числа: n и k ( 2 ≤ n , k ≤ 1 ), разделённые пробелом. во второй строке записаны через пробел n - 2 целых числа – количество монет, которое кузнечик получает на каждом столбике, от 2-го до n - 1 -го. если это число отрицательное, кузнечик теряет монеты. гарантируется, что все числа по модулю не превосходят 1.
выходные данные
в первой строке программа должна вывести наибольшее количество монет, которое может собрать кузнечик. во второй строке выводится число прыжков кузнечика, а в третьей строке – номера всех столбиков, которые посетил кузнечик (через пробел в порядке возрастания).
если правильных ответов несколько, выведите любой из них.
примеры
входные данные
5 3
2 -3 5
выходные данные
7
3
1 2 4 5
Данная задача требует тщательного анализа и нахождения оптимального решения для сбора наибольшего количества золотых монет. Давайте разобьем задачу на несколько шагов для более легкого понимания и решения.
1. Вначале нам нужно вычислить наибольшее количество монет, которые можно собрать. Для этого будем использовать динамическое программирование. Создадим список dp длиной n+1, где dp[i] будет содержать наибольшее количество монет, которое можно собрать, когда кузнечик прыгает на столбик i. Заполним список dp нулями.
2. Теперь пройдемся по всем столбикам, начиная с первого и заполним список dp. Для каждого столбика с номером i (i от 1 до n) вычислим, сколько монет можно собрать, если кузнечик прыгнет на этот столбик. Для этого пройдемся по всем столбикам j, на которые кузнечик может прыгнуть от текущего столбика i, таким образом, j будет в пределах от max(1, i-k) до i-1. Для каждого j вычислим новое значение dp[i] как максимальное значение из dp[j] + количество монет на текущем столбике (если оно положительное) и dp[i]. Здесь dp[j] представляет наибольшее количество монет, которое можно собрать, если кузнечик прыгает на столбик j. Таким образом, dp[i] будет содержать наибольшее количество монет, которое можно собрать, если кузнечик прыгает на столбик i.
3. После заполнения списка dp, найдем максимальное количество монет, которое можно собрать. Для этого возьмем значение dp[n], так как n - это номер последнего столбика.
4. Теперь нужно определить, как кузнечику нужно прыгать, чтобы собрать наибольшее количество монет. Для этого будем двигаться от последнего столбика назад к первому, следуя значениям в списке dp. Начнем с номера последнего столбика n и будем двигаться влево до тех пор, пока не достигнем первого столбика. При каждом шаге будем проверять, прыгая на какой столбик, мы сможем собрать наибольшее количество монет. Если для текущего столбика с номером i значение dp[i] + количество монет на текущем столбике равно dp[n], то мы прыгаем на этот столбик и добавляем его номер в список посещенных столбиков.
5. После завершения шага 4 мы имеем список посещенных столбиков в правильном порядке. Теперь мы можем вывести результат. В первой строке нужно вывести значение dp[n], во второй строке - количество прыжков кузнечика (это будет равно длине списка посещенных столбиков), а в третьей строке - номера всех столбиков, которые посетил кузнечик.
Таким образом, мы получим оптимальное решение, которое позволит кузнечику собрать наибольшее количество монет и выведем второе и третье значения для понятности результата.
Надеюсь, этот подробный и обстоятельный ответ поможет вам понять и решить задачу! Если у вас возникнут дополнительные вопросы, не стесняйтесь задавать их. Удачи в решении задачи!