Начните с массива A положительных чисел. Начните с индекса 0. Из индекса я вы можете перейти к индексу я + x для любого x <= A [i]. Цель состоит в том, чтобы найти минимальное количество ходов, необходимых для достижения конца массива.
Вот пример:
{ 2 , 4 , 1 , 2 , 3 , 2 , 4 , 2}
Если вы всегда заходите как можно дальше в каждом ходу, то это то, что вы получаете:
0 , 2 , 3 , 5 , 7
Это занимает 4 хода. Но вы можете пройти через это быстрее, сделав это так.
0 , 1 , 4 , 7
Это займет всего 3 шага.
Я подумал об этом немного и сделал первое, о чем я думал, но, подумав еще несколько дней, я все еще не знаю, как это сделать лучше.
Вот моя идея. Начните в конце массива и отслеживайте минимальное количество ходов от некоторой позиции до конца. Итак, для примера, moves[7] = 0
, потому что это уже конец. Затем moves[6] = 1
, потому что для достижения цели требуется один шаг. Моя формула
moves[i] = 1 + min(moves[i+1], moves[i+2], ... , moves[i+A[i]])
К тому времени, как я дойду до начала, я знаю количество ходов.
Итак, это O (n ^ 2), который, я думаю, в порядке, но, вероятно, есть более быстрый способ?