Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 06.10.2010
Сообщений: 16

Динамическое программирование

04.05.2011, 23:52. Показов 3218. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер. Мне задали написать задачи на динамическое программирование, но нам ничего не объясняли, поэтому обращаюсь к профессионалам. Помогите пожалуйста написать программы или объясните как с математической точки зрения решать задачи, чтобы можно было вывести рекуррентную формулу к каждой из задач.

Играют два игрока. Есть полоска шириной 1 на 2010 клеток. Первый может закрасить 2, 4 или 6 рядом стоящих клеток( в любом месте полоски), второй 3, 6 или 9. Выигрывает тот кто закрасит последний( второму не хватит места). Кто выиграет при правильной стратегии? (Опять же первый или второй и почему?)

Есть плитка n на n, но в правом верхнем углу одна клетка вырезана и в левом нижнем тоже. Можно ли на неё разложить доминошки размером 1 на 2, чтобы пустых клеток не осталось и чтобы они не накладывались одна на другую?
Заранее большое спасибо...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.05.2011, 23:52
Ответы с готовыми решениями:

Динамическое программирование
Есть задача: Необходимо подсчитать кол-во вариантов и вывести их для сдачи для некой суммы от 1 к ... до 10 р монетами достоинством...

Динамическое программирование
гайс, помогите пожалуйста есть одномерный массив длинной N мы можем ходить по массиву с шагом от I до J(только вперёд офк), скажем...

Динамическое программирование
Приветствую, форумчане. Так уж вышло, что жизнь свела меня с динамическим программированием. Есть задача: Стрелок стреляет по мишеням....

11
Эксперт С++
 Аватар для Хохол
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
05.05.2011, 09:27
Вторая задача к программированию отношения не имеет - ответ всегда "нет".
1
0 / 0 / 0
Регистрация: 06.10.2010
Сообщений: 16
05.05.2011, 09:36  [ТС]
Спасибо за помощь, со второй задачей я с вам согласен, если думать по логике, но преподавателю такой ответ не понравится, поэтому нужно что-то написать.
0
Платежеспособный зверь
 Аватар для кот Бегемот
8966 / 4389 / 1655
Регистрация: 28.10.2009
Сообщений: 11,647
05.05.2011, 15:49
Цитата Сообщение от ExtazY1991 Посмотреть сообщение
Есть плитка n на n, но в правом верхнем углу одна клетка вырезана и в левом нижнем тоже. Можно ли на неё разложить доминошки размером 1 на 2, чтобы пустых клеток не осталось и чтобы они не накладывались одна на другую?
Заранее большое спасибо...
Раскрасим поля плиты в шахматном порядке. Доминошка 1 на 2 должна покрывать одно белое поле и одно чёрное поле.
Для n- нечётного ответ сразу "нет", потому что вырезав две клетки мы всё равно оставим нечётное количество, которое нельзя покрыть доминушками.
Для чётного n ответ так же будет "нет", потому что вырезаны две клетки одного цвета, значит клеток другого цвета будет на 2 больше и покрыть поле не удастся.
2
0 / 0 / 0
Регистрация: 06.10.2010
Сообщений: 16
05.05.2011, 19:59  [ТС]
За вторую задачу большое спасибо. Хохол подсказал, что первая задача делается с помощью теоремы Шпраг-Гранди, но я не очень ее понял можно ее объяснить другим способом или задачу объяснить другим способом? Спасибо ...
0
05.05.2011, 20:32

Не по теме:

Ни фига она с помощью функции Шпрага-Гранди не решается (или я не знаю как), поэтому и удалил.

1
0 / 0 / 0
Регистрация: 06.10.2010
Сообщений: 16
05.05.2011, 21:41  [ТС]
Возможно у кого еще будут идеи? Я думал на каждой итерации подсчитывать количество ячеек, остались и смотреть, если количество клеток, оставшихся кратное 3, 6 или 9, то первый игрок должен сделать так, чтобы кратность была 2, 4 или 6. Но прикол в том, что они могут закрашивать в любом месте линии ячейки, поэтому данная вариант решения не пройдет.
0
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
06.05.2011, 06:12
Для 1-ой задачи предлагаю такой вариант:
сначало для каждого игрока вручную заполняем результат от 0 до 9 включительно:
Для первого игрока:
0 1 2 3 4 5 6 7 8 9 <- Если столько рядом стоящих клеточек осталось и начинает 1-ый игрок
0 0 1 1 1 1 1 1 1 1 <- если 0, то значит первый игрок проиграет, если 1- выиграет

Для второго игрока:
0 1 2 3 4 5 6 7 8 9 <- Если столько рядом стоящих клеточек осталось и начинает 2-ой игрок
0 0 0 1 1 1 1 1 1 1 <- если 0, то значит второй игрок проиграет, если 1- выиграет

Теперь начиная с 10 и до 2010 начинаем использовать ДП:
берем 10 и рассматриваем это число для 1-го игрока так:
- берем число 2. - просматриваем соответственно для второго игрока варианты:
0, 8 - здесь 2-ой игрок выиграет (учитывайте ранее полученные результаты 0 и 8 для 1-го и 2-го
игрока)
1, 7 - здесь 2-ой игрок выиграет (учитывайте ранее полученные результаты 1 и 7 для 1-го и 2-го
игрока)
2, 6 - здесь 1-ый игрок выиграет (учитывайте ранее полученные результаты 2 и 6 для 1-го и 2-го
игрока)
и т.д.
- берем число 4. - просматриваем соответственно для второго игрока варианты:
0, 6 - здесь 2-ой игрок выиграет (учитывайте ранее полученные результаты 0 и 6 для 1-го и 2-го
игрока)
1, 5 - здесь 2-ой игрок выиграет (учитывайте ранее полученные результаты 1 и 7 для 1-го и 2-го
игрока)
2, 4 - здесь 1-ый игрок выиграет (учитывайте ранее полученные результаты 2 и 6 для 1-го и 2-го
игрока)
и т.д.
- берем число 6. - и тоже просматриваем соответствующие для второго игрока варианты...
Если хотя бы в одном из просматриваемых вариантов победа 1-го игрока, то продолжаем таблицу для 1-го игрока. После просмотра числа 10, для 1-го игрока получится:
0 1 2 3 4 5 6 7 8 9 10
0 0 1 1 1 1 1 1 1 1 1

Затем похожее делаем для 2-го игрока (для второго игрока делаем эти расчеты только для того, чтобы использовать эти значения в будущем для вычислений 1-го игрока).
берем 10 и рассматриваем это число для 2-го игрока так:
- берем число 3. - просматриваем соответственно для первого игрока варианты:
0, 7 - здесь 1-ый игрок выиграет (учитывайте ранее полученные результаты 0 и 7 для 1-го и 2-го
игрока)
1, 6 - здесь 1-ый игрок выиграет (учитывайте ранее полученные результаты 1 и 6 для 1-го и 2-го
игрока)
2, 5 - здесь 1-ый игрок выиграет (учитывайте ранее полученные результаты 2 и 5 для 1-го и 2-го
игрока)
3, 4 - здесь 1-ый игрок выиграет (учитывайте ранее полученные результаты 3 и 4 для 1-го и 2-го
игрока) - Здесь маленькое уточнение: если рассматриваем варианты, как сейчас для 1-го игрока,
и оба варианта выигрышные для 1-го и 2-го игрока, и хотя бы один вариант больше 3, то всегда
выиграет 1-ый игрок. В остальных случаях и для 1-го и 2-го игрока будет работать такое правило:
если оба варианта выигрышные для 1-го и 2-го игрока, то выиграет противоположный игрок,
рассматриваемому.
- берем число 6. - просматриваем соответственно для первого игрока варианты:
0, 4 - здесь 1-ый игрок выиграет (учитывайте ранее полученные результаты 0 и 4 для 1-го и 2-го
игрока)
1, 3 - здесь 1-ый игрок выиграет (учитывайте ранее полученные результаты 1 и 3 для 1-го и 2-го
игрока)
2, 2 - здесь 1-ый игрок выиграет (учитывайте ранее полученные результаты 2 и 2 для 1-го и 2-го
игрока)
- берем число 9. - просматриваем соответственно для первого игрока варианты:
0, 1 - здесь 2-ой игрок выиграет (учитывайте ранее полученные результаты 0 и 1 для 1-го и 2-го
игрока)
Итак после просмотра числа 10, для 2-го игрока получится:
0 1 2 3 4 5 6 7 8 9 10
0 0 0 1 1 1 1 1 1 1 1

И так далее.
На самом деле можно остановится рассматривать очередные варианты, для любого числа, для 1-го и 2-го игрока, если попался первый вариант в котором этот игрок выигрывает.
1
0 / 0 / 0
Регистрация: 06.10.2010
Сообщений: 16
06.05.2011, 10:21  [ТС]
Спасибо большое Вы меня реально выручили. Держите +1...
0
Эксперт С++
 Аватар для Хохол
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
06.05.2011, 12:17
valeriikozlov, подозрительно простой у вас пересчет. Думаю, он неверен. Почитайте про стратегию игры ним и пример из статьи про функцию шпрага-ганди. В обоих случаях для каждой подигры недостаточно одной лишь информации о том, является ли её позиция выигрышной. Думаю, тут примерно так же.

Добавлено через 2 минуты
Если бы ходы игроков были одинаковыми, задача решалась бы так же как в примере про функцию ш-г, но тут ходы разные и я не понимаю что делать.
1
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
06.05.2011, 21:19
Хохол, Как с Вами тяжело!
Шучу конечно, все наоборот. Давайте подругому рассмотрим эту задачу.
Цитата Сообщение от Хохол Посмотреть сообщение
но тут ходы разные и я не понимаю что делать.
Это потому что Вы мыслите немного шаблонно и не допускаете мысли что сама задача составлена не очень грамотно. А я это очень хорошо вижу. Мне кажется автор задачи (тот кто ее придумал изначально), не все продумал. В доказательство я приведу алгоритм которому должен придерживаться 1-ый игрок, что бы всегда выиграть (и выиграет при любых значениях от 2 и более).
Итак выигрышный алгоритм 1-го игрока:
- первым ходом 1-ый игрок делает так, что бы оставались 2 клетки и все остальное (таким образом 1-ый игрок сделал только для себя запас хода).
- следующими ходами, 1-ый игрок делает тоже самое, с любой из оставшихся частей.
То что 1-ый игрок при таком алгоритме выиграет - это несомненно. Ведь он оставляет только для себя запас хода, а второй игрок так не может.
2
Эксперт С++
 Аватар для Хохол
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
06.05.2011, 21:37
Ха, прикольно, так просто решается.
Итого, первая задача с такой формулировкой тоже мало отношения к программированию имеет.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.05.2011, 21:37
Помогаю со студенческими работами здесь

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

Лесенка - динамическое программирование
Здраствуйте. У меня есть одна классическая задачка про Лесенку. Лесенка Лесенкой называется набор кубиков, в котором каждый более...

Динамическое программирование. Кааак?
Здравствуйте. Подскажите пожалуйста, в каком направлении двигаться для решения нижеизложенной задачи с помощью метода динамического...

Динамическое программирование - задача
Добрый вечер! На днях попалась такая задача: Миша записывает 2 числа: n и m, а Маша должна разделить число n на m частей, не меняя...

Динамическое программирование (задача)
Помогите советом. Есть задача: В арифметическом выражении разрешается использовать число 1, операции сложения, умножения и скобки. Какое...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru