Member 13192781 Ответов: 2

Это вопрос кодирования. Однако я не требую ответа в коде. Мне просто нужна помощь в выяснении математики, стоящей за этим вопросом.


Вы профессиональный грабитель, планирующий грабить дома вдоль улицы. В каждом доме припрятана определенная сумма денег, единственное ограничение, мешающее вам ограбить каждый из них, - это то, что соседние дома имеют подключенную систему безопасности, и она автоматически свяжется с полицией, если два соседних дома были взломаны в одну и ту же ночь.

Учитывая список неотрицательных целых чисел, представляющих сумму денег в каждом доме, определите максимальную сумму денег, которую вы можете ограбить сегодня вечером, не предупредив полицию.

Примечание: "список" на самом деле представляет собой массив целых чисел, где индекс элемента означает положение дома, а элемент-сумму денег, спрятанных в нем. Грабитель не может грабить соседние индексы. В качестве примера массив выглядит следующим образом

[10 50 7 15 500 100]

Что я уже пробовал:

Я думал просто сложить альтернативные элементы, но эта логика не даст правильного результата для многих случаев, особенно для образца, который я включил в свой вопрос. Правильный ответ в этом случае - просто сложить 500 и 50.

Richard MacCutchan

Математика довольно проста, сначала вы идете за 500, так как это самое высокое значение, а затем смотрите, к каким другим домам можно получить доступ.

W∴ Balboos, GHB

Начинать с самого большого не обязательно как общее решение! Предположим, что 500 находится между двумя 400-ми ?

Мой первый инстинкт-следовать правилу несмежности и делать все юридические перестановки , отмечая, что некоторые могут оставить два соседних дома без посещения.

Richard MacCutchan

Вы, конечно, правы. Мой ответ был чрезмерным упрощением.

Member 13192781

Спасибо вам всем за помощь.

2 Ответов

Рейтинг:
7

CPallini

Цитата:
Я подумал о том, чтобы просто сложить альтернативные элементы
Почему?
Вы должны попытаться добавить все 'не-соседние предметы' ('альтернативные элементы'является подмножеством).
Это не сложно, двух вложенных циклов будет достаточно.


Member 13192781

Спасибо вам всем за помощь. Я приму ваши замечания во внимание.

Рейтинг:
12

Patrice T

Принцип: вам нужно найти каждую комбинацию дома, которая соответствует критериям не вызывать полицию. Для каждой комбинации вычислите сумму денег. Оставь себе самое лучшее.

Возьмите лист бумаги, используйте столбец на дом и строку на комбинацию.
посмотрите, как вы рисуете первую комбинацию, посмотрите, как вы переходите к следующей, и как вы знаете, что вы в конце.
Ваша программа будет следовать тому же принципу.

Как программист, ваша задача-создавать алгоритмы это решает конкретные проблемы, и вы не можете полагаться на кого-то другого, чтобы вечно делать это за вас, поэтому есть время, когда вам придется научиться этому. И чем скорее, тем лучше.
Создание алгоритма-это в основном поиск математики и необходимая адаптация к вашей реальной задаче.

[Обновление]

Цитата:
На самом деле я нахожусь в процессе изучения алгоритмов

- Изучите один или несколько методов анализа, У. Е. сверху вниз Djikstra способ это хорошее начало.
https://en.wikipedia.org/wiki/Top-down_and_bottom-up_design[^]
https://en.wikipedia.org/wiki/Structured_programming[^]
https://en.wikipedia.org/wiki/Edsger_W._Dijkstra[^]
https://www.cs.utexas.edu/users/EWD/ewd03xx/EWD316.PDF[^]

Интересная ссылка:
Учитесь программировать[^]


Member 13192781

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