|
11 / 10 / 5
Регистрация: 25.07.2020
Сообщений: 302
|
|
Найти лексикографически минимальную строку, которую можно получить при переходе из первой строки матрицы в последнюю01.09.2020, 18:08. Показов 5510. Ответов 29
Метки нет (Все метки)
Вам дана нижнетреугольная матрица из n строк (i-й ряд состоит ровно из i элементов, расположенных в столбцах с номерами от 1 до i). В каждой ячейке матрицы записана маленькая латинская буква. Также у вас есть пустая строка s.
Вы стоите в ячейке с координатами (1, 1) (первая строка, первый столбец). На каждом ходу можно делать переход на одну ячейку ниже или на одну ячейку по диагонали вправо-вниз. То есть из ячейки с координатами (i,j) можно попасть в ячейки (i+1,j) или (i+1,j+1). Каждый раз, когда вы попадаете в новую ячейку, к строке s в конец приписывается буква, стоящая в этой ячейке. Найдите лексикографически минимальную строку, которую можно получить при переходе из первой строки матрицы в последнюю (n-ю). Формат входных данных В первой строке задано число n(1≤n≤5⋅10**3).Затем идёт n строк, в i-й находится строка из i символов, отвечающая первым i столбцам i-й строки матрицы. Формат результата Выведите искомую строку. Примеры Входные данные 3 o nu mwb Результат работы onm Входные данные 4 a bb czc defr Результат работы abcd Написал алгоритм, но там ошибка, понял как исправить, но не могу тупо реализовать это.
0
|
|
| 01.09.2020, 18:08 | |
|
Ответы с готовыми решениями:
29
Вывести лексикографически минимальную строку
|
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
|
||
| 03.09.2020, 01:04 | ||
|
Если бы было заранее известно, что строки не содержат повторяющихся символов, то задача была бы тривиальной. Но возможность встретить повторяющиеся символы несколько усложняет решение. Тем не менее задача запросто решается в лоб одним проходом сверху вниз. Нужно лишь поддерживать набор "достижимых" клеток строки матрицы. Минимальный достижимый символ на текущей строке порождает две достижимых клетки на следующей строке. Если на какой-то строке матрицы окажется, что среди достижимых символов есть несколько минимумов, то все эти минимумы должны породить достижимые клетки на следующей строке. Вот и все.
0
|
||
|
2689 / 1346 / 485
Регистрация: 08.11.2016
Сообщений: 3,734
|
||||||
| 03.09.2020, 08:11 | ||||||
|
TheCalligrapher, рекурсивный алгоритм здесь напрашивается сам собой, понятное дело что он не единственный, учитывая что всякий рекурсивный алгоритм может быть представлен циклом (также верно и обратное), и может быть не самый эффективный, но для этой задачи он самый понятный и просто реализуемый. Вашу идею не понял (простите, туп) если не слишком лениво выразите кодом, ну или объясните на тривиальном предельном примере:
0
|
||||||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
|
|||
| 03.09.2020, 09:39 | |||
|
С другой стороны, ситуация, когда ветвление нужно, т.е. когда на строке находится несколько минимумов, интуитивно выглядит "исключительной" и заводить рекурсию только ради нее не хочется. К тому же у обычной рекурсии (в частности - у вашей реализации) есть и еще один очевидный недостаток: она может и будет анализировать одни и те же подпути несколько раз. На приведенном вами же примере это явление будет приводит к огромному взрыву ненужных рекурсивных поисков на каждом уровне рекурсии. 1. Мы начинаем со строки i=1 и множества столбцов-кандидатов J={ 1 }2. В текущей строке i просматриваем все текущие столбцы-кандидаты J и находим среди них все минимумы. 3. Для каждого найденного минимума j добавляем индексы j и j + 1 в множество столбцов-кандидатов Jnext - для следующей строки4. Делаем ++i, J = Jnext и переходим на шаг 2.5. Некоторые усилия понадобятся для того, чтобы добравшись до последней строки восстановить возможный путь по кандидатам от корня до последней строки. В вашем экстремальном примере получится, что на каждой итерации все столбцы каждой строки будут попадать в множество кандидатов... (С кодом - возюкаюсь пока)
1
|
|||
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
||
| 03.09.2020, 09:50 | ||
|
0
|
||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
|
|
| 03.09.2020, 10:02 | |
|
0
|
|
|
2689 / 1346 / 485
Регистрация: 08.11.2016
Сообщений: 3,734
|
||
| 03.09.2020, 10:21 | ||
0
|
||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
|
|||||||
| 03.09.2020, 10:30 | |||||||
J на последней итерации, но я не стал)
0
|
|||||||
|
2689 / 1346 / 485
Регистрация: 08.11.2016
Сообщений: 3,734
|
|
| 03.09.2020, 11:19 | |
|
TheCalligrapher, нет... так не сработает... такой алгоритм потеряется уже через строку, даже для приведенного примера он дает результат "abbbbbbbbbbc", а должен выдать "abbbbbbbbbba", по ходу деваться особо некуда и так или иначе придется пихать предположения в стэк.
Есть у меня одна индейка... пока обмозгую. Первоначальный мой вариант - однозначный фейл - сложность O(2n).
0
|
|
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
|
||||||||
| 03.09.2020, 11:40 | ||||||||
Сообщение было отмечено Annemesski как решение
Решениеj_min = j;, а не j_min = i;Еще раз, исправленная версия
J - это и есть заменитель "стека" в моей реализации. Больше никакого стека (и рекурсии) не нужно. Алгоритм однопроходный, как правильно заметил zayats80888, возвращаться назад нам никогда не нужно, поэтому "исторические" значения J нас не интересуют. Именно из-за этого соображения явно рекурсивные решения выглядят "подозрительно".
1
|
||||||||
|
2689 / 1346 / 485
Регистрация: 08.11.2016
Сообщений: 3,734
|
|||||||||||||
| 03.09.2020, 12:17 | |||||||||||||
![]()
0
|
|||||||||||||
| 03.09.2020, 12:17 | |
|
Ввести строку, создать вторую строку в два раза больше, в которую записать симболы первой строки
Проверить, можно ли, меняя местами четные и нечетные символы первой строки, получить вторую строку
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал.
Оно само - говорит.
Кто слышит тот слышит.
|
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было
ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась.
Первый вариант. . .
|
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2.
Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
|
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет.
Но обычно это 50 лет и более.
Наверное, закисление почвы происходит сезонно в средней. . .
|
|
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
|
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS
Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
|
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи.
Через несколько переработок от PHP кода к C89 (надеюсь, 89).
Но довольно запутанно получилось. Код для Linux.
Но если убрать time и то, что с ним. . .
|
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки
Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
|