392 / 284 / 53
Регистрация: 26.12.2009
Сообщений: 874
|
|
1 | |
Маршрут24.10.2010, 15:38. Показов 3602. Ответов 18
Метки нет (Все метки)
массив 10х10 заполнено числами. Начало маршрута в левом нижнем углу. Конец - в правом верхем. Можна двигаться только прямо или вправо. Найти такой маршрут, чтобы сума чисел в ячейках была максимальной.
0
|
24.10.2010, 15:38 | |
Ответы с готовыми решениями:
18
Маршрут Маршрут в таблице Маршрут Bus Кратчайший маршрут |
392 / 284 / 53
Регистрация: 26.12.2009
Сообщений: 874
|
|
24.10.2010, 15:53 [ТС] | 2 |
нужно вывести маршрут в формате :RFFRFFRRRRRRRFFFFF
R - шаг вправо F - шаг вперед
0
|
1563 / 1041 / 94
Регистрация: 17.04.2009
Сообщений: 2,995
|
||||||
24.10.2010, 16:15 | 3 | |||||
1
|
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
|
|
24.10.2010, 16:21 | 4 |
KuKu, Ничего подобного. Вот Вам контрпример: вся матрица заполнена 1. Левый край и верхний край заполнен 2. А в нижнем правом углу значение 1000000. Ваш алгоритм не найдет нужного ответа.
Mayonez, С динамическим программированием знакомы?
0
|
392 / 284 / 53
Регистрация: 26.12.2009
Сообщений: 874
|
|
24.10.2010, 18:23 [ТС] | 6 |
если надо - познакомлюсь
Добавлено через 59 минут Можно что-то поконкретнее...
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
24.10.2010, 18:50 | 7 |
Уже была недавно подобная тема, я там посоветовал обратить внимание на алгоритм поиска кратчайшего пути между парой вершин во взвешенно орграфе.
1
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
24.10.2010, 19:07 | 8 |
silent_1991, Ага. Это Дейкстры или Флойда-Уоршалла который кажется? Вроде как оба подойдут
1
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
24.10.2010, 19:14 | 9 |
Флойда - он находит пути между всеми вершинами... А Дейкстра ищет между одной и всеми остальными. А тут другой немного нужен, который путь между парой ищет (у него незапоминающиеся фамилии))) )
Добавлено через 1 минуту Хотя конечно можно любой использовать, потом просто выбрать нужный путь и всё. Но тогда куча ненужных расчётов.
1
|
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
|
|
24.10.2010, 23:21 | 10 |
Mayonez, В общем эту задачу можно сделать так:
В один массив считываем данные (такие как у Вас на картинке). Создаем второй массив таким же размером. В этом массиве (после того как мы его заполним) в каждой ячейке будет хранится максимальное значение, которое можно для этой ячейки достигнуть, двигаясь только прямо или вправо с нижнего левого угла. Теперь порядок заполнения значениями этого массива. Вариантов заполнения несколько (но результат всегда одинаковый), я приведу такой. Сначало заполняем левую сторону вот так (идем снизу вверх): - самая нижняя ячейка будет равна 15 (я беру данные сейчас для приведенного массива) - а в общем случае самая нижняя ячейка всегда будет равна значению левой нижней ячейки массива со входными данными. - следующая (левая вторая снизу) будет равна 18 (сумме нижней на одну ступень ячейки второго массива и соответствующей ячейки первого массива) - тут уж не поспоришь (если двигаться можно только вверх и направо, то для данной ячейки самое большое значение может быть только 18) - следующая (левая третья снизу) - по такой же аналогии (сумма нижней на одну ступень ячейки второго массива и соответствующей ячейки первого массива) - 23 - и т.д. до самого верха самого левого ряда. Добавлено через 8 минут Теперь второй слева столбец (и все остальные за ним) заполняются так (начинаем опять снизу): - самый нижний элемент всегда будет равен сумме предудущего слева элемента во втором массиве и соответствующего элемента в первом массиве (т.е. для второго столбца самый нижний элемент будет равен - 22) тут тоже не поспоришь, ведь путь в эту клетку только один. - все последующие элементы выбираются так: сравниваем во два элемента во втором массиве (слева от текущего элемента и снизу от текущего элемента), который элемент из этих больше, его значение суммируем с текущим элементом из первого массива и получаем значение текущего элемента во втором массиве. Таким образом мы определяем масимальное значение для каждой клетки которое можно набрать двигаясь только прямо или вправо с нижнего левого угла. Добавлено через 11 минут Таким образом мы заполним весь второй массив. В врехнем правом углу получится максимальное значение, которое можно набрать. Теперь о пути. Путь можно вычислить, после заполнения второго массива, двигаясь обратно. Для этого создаем массив, в котором будем хранить сам путь (хотите типа char сразу, хотите типа int - это все непринципиально). Размер массива всегда будет равен n+(n-2) - не количество пройденных клеток, а количество перемещений между ними. Итак начинаем с верхнего правого элемента второго массива - будем называть рассматриваемый элемент массива текущим. Если от значения текущего элемента второго массива отнять значение текущего элемента первого массива и получится значение левого от текущего элемента второго массива, то записываем в массив пути F и делаем текущим элемент слева от текущего. Если полученное значение равно значению нижнего от текущего элемента второго массива, то записываем в массив пути R и делаем текущим элемент снизу от текущего. И так до конца (до того момента пока текущим не станет самый ниэний левый элемент). Вывод результата производить с конца массива пути.
2
|
392 / 284 / 53
Регистрация: 26.12.2009
Сообщений: 874
|
||||||
25.10.2010, 21:43 [ТС] | 11 | |||||
для таблиц до 100х100 вроде работает а где тут динамическое программирование?
0
|
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
|
|
25.10.2010, 21:55 | 12 |
Mayonez, что выдает Ваша программа на приведенные Вами значения в массиве? А потом подайте на вход те же значения массива только исправьте правое нижнее значение на 100000 и напишите что получилось?
1
|
1563 / 1041 / 94
Регистрация: 17.04.2009
Сообщений: 2,995
|
|
25.10.2010, 22:04 | 13 |
valeriikozlov, вы конечно правы. Но одно дело сделать так, чтобы работало всегда, а другое что бы работало как требуется. От него не требуют большего. Так тут в каждом втором задании на форуме можно найти недочеты.
0
|
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
|
|
25.10.2010, 22:13 | 14 |
абсолютно согласен.
тоже абсолютно согласен. тоже согласен. (шучу конечно) я тоже бывает ошибаюсь, ведь я тоже человек. Просто я практически только вернулся с другого сайта, где даже малейшим ошибкам не было места, или все правильно или не зачет. Наверное это сказывается, Вы тоже в чем-то правы!
1
|
392 / 284 / 53
Регистрация: 26.12.2009
Сообщений: 874
|
|
25.10.2010, 22:19 [ТС] | 15 |
0
|
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
|
|
25.10.2010, 22:25 | 17 |
Что же у Вас за компилятор, который запросто переваривает stl, а в переменной типа int не выносит значений более 32767? Ну тогда запишите туда значение не 100000 а 10000.
1
|
392 / 284 / 53
Регистрация: 26.12.2009
Сообщений: 874
|
|
25.10.2010, 22:28 [ТС] | 18 |
RRRRRRRRRFFFFFFFFF как не странно??
Добавлено через 1 минуту да, ошибся
0
|
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
|
|
25.10.2010, 22:33 | 19 |
это и называется динамическим програмированием.
Добавлено через 1 минуту Если хотите разобраться в нем побольше, Вам нужно что-нибудь почитать об этом.
1
|
25.10.2010, 22:33 | |
25.10.2010, 22:33 | |
Помогаю со студенческими работами здесь
19
Оптимальный маршрут почтальона Найти кратчайший маршрут программа шахматы (маршрут коня) Найти самый дорогой маршрут Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |