Предмет: Информатика, автор: MrMiner1

Задача удалена.......................


IUV: Перед исправлением
C++ С клавиатуры вводится n: длина массива arr. Далее массив arr заполняется целыми числами. Требуется программа, находящая наибольшую возрастающую подпоследовательность в массиве. Пример: Входные данные: 5 1 6 3 2 5 Вывод: 3 Входные данные: 10 1 10 2 3 6 5 4 8 9 7 Вывод: 6
IUV: 13.01.2019
21:35 MrMiner1 добавил комментарий показать
21:29 Indentuum добавил решение
21:05 MrMiner1 отредактировал задачу
20:20 MrMiner1 добавил задачу
DigitalAnnihilator: У задачи нет условия -> она должна быть удалена
IUV: отвечающий не виноват что пока он писал решение автор изменил условие. удаление задачи привело бы к удалению труда отвечающего.
DigitalAnnihilator: В коментах к ответу все описано)

Ответы

Автор ответа: Indentuum
3

Мы ищем динамикой наибольшую подпоследовательность для отрезка [0; i] где гарантировано должен быть i-ый элемент. Потом выбираем из всех наибольшее число.

Приложения:

DigitalAnnihilator: Не буду подробно, в двух словах
DigitalAnnihilator: Исключено использование оператора '>>' без защитных конструкций.

Причина:
Оператор >> является частью стандартной библиотеки C++, как и большинство функций/классов он способен выбрасывать исключения.
В свою очередь, при вводе неверной информации по стандарту не гарантированно инициализация переменной переданной в оператор >> как параметр, что является undefined behavior.
То есть, при неверном вводе данных в зависимости от компилятора будет определено следующие сценарии поведения:
DigitalAnnihilator: - throw exeption и в отсутствии try-catch конструкции над ним - креш в рантайме
- инициализация переменной default значением
- инициализация переменной мусором

Исключения:
При наличии try-catch конструкции оборачивающей ввод данных.

Рекомендация:
Лучше использовать функцию getline и явное преобразование данных из char* в необходимый тип данных.
DigitalAnnihilator: А так же
DigitalAnnihilator: При использовании инкрементирующего оператора следует использовать только его префиксную форму.
DigitalAnnihilator: Причина:
При использованной оператора префиксной формы происходит увеличение значения, после чего return операция его уже нового значения.
В отличие от префиксной - постфиксная форма предполагает сначала return текущего значения, после чего увеличение текущего значения, что влечет за собой более длительный процесс выполнения операции и использование в 2 раза больше памяти для сохранения предыдущего значения.
DigitalAnnihilator: Исключение:
Особые алгоритмы требующие данного поведения.

Примечание:
Операция инкремента равно-справедлива для всех типов для которых она определена, в том числе и итераторов, что может повлечь значительные потери в производительности, хотя на первый взгляд, если ограничиваться integer, данного явления не наблюдается.
DigitalAnnihilator: к слову о циклах
DigitalAnnihilator: При использовании сокращенной формы цикла for необходимо итерировать её элементы по константной ссылке.

Причина:
При использовании константной ссылки, избегаются следующие ситуации снижающие производительность & безопасность кода:
- Ссылка обеспечивает гарантированное использование объекта без создания его копии
- Константа обеспечивает гарантированную защиту ссылки от модификации
Таким образом снижается потребление памяти, время выполнения кода, а так же код остается безопасным.
DigitalAnnihilator: Исключения:
Константность может быть не использована в силу необходимости модификации элементов коллекции.

Примечание:
Передача элементов по значению в цикле исключена. Приемлем только вариант подобный:
for ( auto& element : collection)
Похожие вопросы
Предмет: Математика, автор: amirjsjfjfkdmeleo8
Предмет: Геометрия, автор: dristalitilite
Предмет: Математика, автор: dan243