|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
26.12.2012, 19:45 | #1 |
Новичок
Джуниор
Регистрация: 26.12.2012
Сообщений: 8
|
динамическое программирование (Ship rootes)
Задача на динамическое программирование:
Римский турист отправился в плавание по Средиземному морю. Он прибыл в один из городов 3 островов, которые он собирается посетить. Каждый остров имеет в точности N городов и все они являются портами. турист планирует начать путешествие с того города,в котором он находится и посетить другие 3*N - 1 городов в точности один раз и затем вернуться в начальный город, чтобы вернуться обратно домой после этого. К сожалению на дорогах трех островов есть каннибалы. Поэтому путешествие между 2 городами одного и того же острова очень опасно и запрещено. К счастью, есть морские пути. Каждая пара городов, находящихся не на одном острове связаны таким морским путем. Морских путей между гордами,к оторые на одном острове нет. Турист хочет знать, сколькими способами он может спланировать свое путешествие по 3 островам Ввод Содержит одно число N (1<=N<=30), то есть количество городов на каждом из трех островов Вывод Вывести одно число: количество способов, которыми турист может спланировать свое путешествие. Заметьте, что два путешествия являются идентичными если последовательности из 3*N городов идентичны ИЛИ если последовательность из 3*N городов первого путешествия идентична последовательности из 3*N городов второго путешествия, считанной наоборот ( например, если каждый остров имеет один город, пронумерованный в соответствии с номером острова, путешествия 1-2-3-1 и 1-3-2-1 будут идентичными Пример ввода 2 Пример вывода 16 /* А это те 16 разных маршрутов: 1 3 5 2 4 6 1 3 5 2 6 4 1 3 6 2 4 5 1 3 6 2 5 4 1 4 5 2 3 6 1 4 5 3 2 6 1 4 6 2 3 5 1 4 6 3 2 5 1 5 2 4 6 3 1 5 3 2 4 6 1 5 3 6 2 4 1 5 4 6 2 3 1 6 2 4 5 3 1 6 3 2 4 5 1 6 3 5 2 4 1 6 4 5 2 3 */ Лимит времени 1 секунда Лимит памяти 16 МБ Последний раз редактировалось gdrt; 27.12.2012 в 13:04. Причина: перевод на русский |
27.12.2012, 12:58 | #2 |
Новичок
Джуниор
Регистрация: 26.12.2012
Сообщений: 8
|
Спасибо за перевод asidorchenko
Последний раз редактировалось gdrt; 27.12.2012 в 13:06. |
27.12.2012, 13:31 | #3 |
Старожил
Регистрация: 25.10.2011
Сообщений: 3,178
|
Пусть мы на острове A, число непосещённых городов на островах A, B, C - a, b, c соответственно. Пусть число путей, считая "зеркальные" пути разными - S(a, b, c). Тогда:
S(a, b, c) = 0 при b+c<a; S(a, b, c) = (a!)^2 при b+c=a; S(a, a+1, 0) = (a+1)*(a!)^2; S(a, b, 0) = 0 при b!=a, b!=a+1; S(a, b, c) = b*S(b-1, c, a) + c*S(c-1, b, a) при b+c>a. Последний раз редактировалось Abstraction; 27.12.2012 в 16:54. Причина: Забыл множественный выбор |
27.12.2012, 13:47 | #4 |
Новичок
Джуниор
Регистрация: 26.12.2012
Сообщений: 8
|
А Вы можете объяснить подробнее каждый случай? Ибо мне нужно будет обосновать решение
|
27.12.2012, 14:09 | #5 |
Старожил
Регистрация: 25.10.2011
Сообщений: 3,178
|
Да, пожалуйста. Какой непонятен?
|
27.12.2012, 14:13 | #6 |
Новичок
Джуниор
Регистрация: 26.12.2012
Сообщений: 8
|
В принципе все эти 5 случаев непонятны))
|
27.12.2012, 16:08 | #7 |
Новичок
Джуниор
Регистрация: 26.12.2012
Сообщений: 8
|
|
27.12.2012, 16:53 | #8 | |||
Старожил
Регистрация: 25.10.2011
Сообщений: 3,178
|
Цитата:
Цитата:
Цитата:
И так далее. Только вот кое-кто не учёл, что маршрут надо замкнуть. Это означает, что функций две: для случая, когда мы на начальном острове (S) и когда нет (R, начальный остров - B). S(a,b,c) = (a+1)!*a! при b+c=a+1; S(a,b,c) = 0 при b+c<=a; S(a,b,0) = 0 при b>a+1; R(a,b,c) = 0 при b+c<a; R(a,b,0) = 0 при b>a; R(a,0,c) = 0 при c>a+1; R(a,b,c) = c*R(c-1,b,a) + b*S(b-1,a,c); S(a,b,c) = b*R(b-1,a,c) + c*R(c-1,a,b); Искомое (поскольку каждый путь обратим и обратный не совпадает с исходным) - S(N-1,N,N)/2. В нашем случае: X = S(1,2,2)/2 = (2R(1,1,2)+2R(1,1,2))/2 = 4R(1,1,1)+2S(0,1,2) = 4R(0,1,1)+4S(0,1,1)+2R(0,0,2)+4R(1, 0,1) = 4R(0,1,0)+4S(0,0,1)+4R(0,0,1)+4R(0, 0,1)+2*0+4*1 = 4*0+4*1+4*1+4*1+2*0+4*1 = 16. |
|||
27.12.2012, 21:39 | #9 |
Новичок
Джуниор
Регистрация: 26.12.2012
Сообщений: 8
|
Спасибо огромное, осталось понять только это
почему вы отнимаете единичку и смещаете параметры? Последний раз редактировалось gdrt; 27.12.2012 в 21:53. |
27.12.2012, 22:05 | #10 |
Старожил
Регистрация: 25.10.2011
Сообщений: 3,178
|
Число способов пропутешествовать, если я нахожусь на острове A и в конце вернуться я тоже должен на A - S(a,b,c). Первым шагом я могу либо поплыть на остров B, либо на остров C. Рассмотрим первый случай. Я могу выбрать любой из оставшихся b портов и в итоге окажусь на острове A'=B, с непосещёнными (b-1) портами на нём, и это не тот остров, на который я должен вернуться в конце. На том острове, на который я возвращаюсь в конце, B'=A, осталось a непосещённых портов; на третьем острове C'=C осталось c непосещённых портов. Таким образом, выбрав любой из b портов, я буду иметь R(b-1, a, c) вариантов завершения путешествия. Аналогично, поплыв первым шагом на остров c, я выбираю один из c портов и остаётся R(c-1, a, b) вариантов завершения путешествия. Всего: S(a,b,c)=b*R(b-1,a,c)+c*R(c-1,a,b). R(a,b,c) расписывается аналогично.
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Динамическое программирование | GoldSieg | Паскаль, Turbo Pascal, PascalABC.NET | 0 | 12.04.2012 16:35 |
Динамическое программирование. | IllidanStormrage | Помощь студентам | 0 | 06.11.2011 19:03 |
Динамическое программирование!!! | Fuckkiller | Microsoft Office Excel | 13 | 04.05.2011 19:03 |
динамическое программирование | stefan0202 | Паскаль, Turbo Pascal, PascalABC.NET | 3 | 07.02.2011 22:05 |
Динамическое программирование | joey_ramone | Паскаль, Turbo Pascal, PascalABC.NET | 0 | 23.04.2010 13:51 |