829 / 353 / 64
Регистрация: 30.01.2009
Сообщений: 1,204
|
||||||
1 | ||||||
Динамическое программирование08.06.2012, 20:27. Показов 7327. Ответов 12
Метки нет (Все метки)
Есть такая задача:
Дана схема стены, необходимо проверить можно ли построить данную стену заданным набором кирпичей. Кирпич высот 1, а длина от 1 до 8. В стене может быть дыры, она может состоят из разных частей. Пример решения взял с задачи про сдачу Вот мое решение, но оно не всегда выдает правильное решение. На этом примере работает правильно 6 3 101101 111111 111111 3 1 4 2 6 3 1 а тут нет 8 2 11111111 00000000 3 1 7 3 2 4 1
0
|
08.06.2012, 20:27 | |
Ответы с готовыми решениями:
12
Динамическое программирование динамическое программирование Динамическое программирование. Динамическое программирование |
829 / 353 / 64
Регистрация: 30.01.2009
Сообщений: 1,204
|
|
10.06.2012, 01:52 [ТС] | 2 |
Up!
Кто-то может подсказать в решении задачи о сдаче?!
0
|
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
|
|
10.06.2012, 07:52 | 3 |
У Вас условие очень скромное (похоже не все написали).
Можно ли кирпичи ставить вертикально? Максимальный размер массива описывающий стену?
0
|
829 / 353 / 64
Регистрация: 30.01.2009
Сообщений: 1,204
|
|
10.06.2012, 13:33 [ТС] | 4 |
Кирпиче ставят только горизонтально, размер стены неограниченный, как и конструкция стены.
Все данные считываются с файла: 1) Считываются ширина и высоты стены; 2) Считывается матрица стены: 1 - кирпич, 0 - дыра (себе для облегчения я считаю, что после дыры начинается новый псевдоряд) 3) Считывается количество кирпичей в наборе 4) Считываются кирпичи: первое число - ширина кирпича, второе - кол-во
0
|
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
|
|
10.06.2012, 15:28 | 5 |
insolent, динамическое программирование в этой задаче не применимо (по крайней мере я точно не вижу как его применить).
Самое сложное в этой задаче попытаюсь объяснить таким примером: есть набор кирпичей: 4 1 1 2 1 3 1 4 1 В первой строке стены есть 5 подряд идущих единиц. Чтобы бы набрать 5 единиц можно использовать два варианта: (2 и 3) или (1 и 4). Но в следующей строке может быть: (1 отдельная единица и 4 отдельно подряд идущих единиц) или (2 отдельно подряд идущих единицы и 3 отдельно подряд идущих единицы). Поэтому выбрав для первой строки какой-то вариант, может не получиться заполнить вторую строку (хотя на самом деле построить такую стену можно). Я привел маленький пример. Для больших стен будет важно как укладывать кирпичи в каждом ряду. Задача пахнет перебором, а не ДП. Я вообще переформулировал бы задачу так: Считаем подряд идущие единицы в каждом ряду и получаем сколько каких рядов нужно набрать. Например для теста: 6 3 101101 111111 111111 Получилось бы так: 1 2// нужно набрать два ряда размером 1 2 1// нужно набрать один ряд размером 2 6 2// нужно набрать два ряда размером 6 Можно ли набрать такие ряды имея такой набор кирпичей: 3 1 4 2 6 3 1 И получается что эта задача имеет мало что общего с задачей про сдачу, а больше похожа на задачу: http://acm.timus.ru/problem.aspx?space=1&num=1115
1
|
829 / 353 / 64
Регистрация: 30.01.2009
Сообщений: 1,204
|
|
10.06.2012, 20:02 [ТС] | 6 |
Я использовал ДП из соображения, что каждый ряд нужно построить найменьшим числом кирпичей.
Очень похожа, теперь бы разобраться, как её решить..
0
|
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
|
|
10.06.2012, 21:29 | 7 |
Перебором. Но при переборе использовать жадный алгоритм: начинать с заполнения максимальных рядов (максимального количества подряд идущих единиц) и пытаться использовать сначало кирпичи с максимальной длиной.
1
|
829 / 353 / 64
Регистрация: 30.01.2009
Сообщений: 1,204
|
|
10.06.2012, 23:26 [ТС] | 8 |
valeriikozlov, спасибо за помощь буду пробовать решить. Я первоначально хотел решать жадным алгоритмом, но чего-то решил делать с помощью метода ДП
0
|
829 / 353 / 64
Регистрация: 30.01.2009
Сообщений: 1,204
|
|
13.06.2012, 00:51 [ТС] | 9 |
Как лучше начать перебор решений?
Например, возьмем первый пример: 6 3 101101 111111 111111 3 1 4 2 6 3 1 Есть у меня массив количества единичных кирпичей в каждом ряду {6, 6, 1, 2, 1} и набор кирпичей {(1 4), (2 6), (3 1)}. Мне нужно будет отсортировать каждый массив по убыванию, а перебор начинать с максимального значения ширины кирпича и вычитать из данных кирпичей в схеме, если не получается, то начинать перебор с кирпича, следующим после максимальной ширины и так далее. Я правильно понимаю логику решения?
0
|
829 / 353 / 64
Регистрация: 30.01.2009
Сообщений: 1,204
|
|
15.06.2012, 13:22 [ТС] | 10 |
Up!!!
0
|
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
|
||||||
15.06.2012, 19:32 | 11 | |||||
insolent, извиняюсь, что на некоторое время оставил тему - был очень занят.
Я сейчас просто опишу алгоритм (которым сам пользовался - вполне возможно есть лучше, но вряд ли). Допустим есть: Я не знаю как Вы будете хранить эти данные: может воспользуетесь массивом структур, вектором, map. Не сильно важно. Главное что бы был отсортирован по невозрастанию: 6 2// значит рядов из 6-ти кирпичей 2 штуки 2 1// значит что рядов из 2-х кирпичей одна штука 1 2// значит что рядов из 1-го кирпича 2 штуки или так: 6 6 2 1 1 Назовем такое хранилище a[] Затем: тоже не знаю как будете хранить, но назовем такое хранилище b[]. Его тоже нужно отсортировать по неубыванию: (3 1), (2 6), (1 4). Тогда основной код будет выглядеть так:
1
|
monkaddict
|
|
05.09.2012, 18:22 | 12 |
|
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
|
||||||
05.09.2012, 23:10 | 13 | |||||
не затруднит (код именно для указанной insolent задачи. Ввод данных из файла input.txt .Вывод результата в файл output.txt):
1
|
05.09.2012, 23:10 | |
05.09.2012, 23:10 | |
Помогаю со студенческими работами здесь
13
ДП Динамическое программирование Динамическое программирование Динамическое программирование Динамическое программирование Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |