Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не могу разобраться с рекурсией, укладка плитки 
:(
    Опции темы
Jilian
Дата 15.2.2006, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 24.1.2005
Где: Минск

Репутация: нет
Всего: нет



Коридор имеет размеры 3*N. Для любого заданного N, необходимо определить максимальное количество различных вариантов, которыми можно уложить паркет в этом коридоре плитками размером [1*2] или [2*2] (сами варианты укладки паркета определять не надо).
Например для N=2, ответом будет 5.

Это сообщение отредактировал(а) Jilian - 15.2.2006, 20:53
PM MAIL   Вверх
cardinal
Дата 15.2.2006, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 5
Всего: 99





--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Jilian
Дата 15.2.2006, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 24.1.2005
Где: Минск

Репутация: нет
Всего: нет



А зачем мне числа Фибоначчи? О них и Вирте почитать можно -)
PM MAIL   Вверх
SoWa
Дата 15.2.2006, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 6
Всего: 74



Не понял?
там числа фибоначи и рекурсия. А тут ищем кол-во.
Составить ф-ю и максимизировать её. Только вот с функцией проблемма.


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
Jilian
Дата 15.2.2006, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 24.1.2005
Где: Минск

Репутация: нет
Всего: нет



Так ведь и ёжику понятно, что функцию надо составить. Только вот я никак не могу её составить. Ясно, что функция рекурсивная, но не все что рекурсия, есть числа Фибоначчи, с таким же успехом Вы могли дать мне ссылку на Ханойские башни.
Нет, в данной задачи Фибоначчи не поможет -)
PM MAIL   Вверх
esperant0
Дата 15.2.2006, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 714
Регистрация: 20.5.2005

Репутация: 4
Всего: 14



Решим сначала задачу.

Нужно замостить 1*х метров с помощью досок длиной 1*2 и 1*8

Решается с помощью динамического программирования.


Обозначим черех Ф(Х) количество способов замостить доску размером 1*х


очевидно, что
Ф(х)=Ф(х-2)+Ф(х-8)

Ф(1)=0
Ф(2)=1
Ф(3)=0
...
Ф(8)=2

вот уравнение решая которое находим ответ.


Ваша задача решаеться аналогичной техникой. Подумайте как



--------------------
 
 Student->Teacher Assistant ->Research assistant->Microsoft Software Development Engineer 

Пользователь получил наказание за то, что проигнорировал замечание которое было написано модератором  а затем стерто и которое он - пользователь не мог видеть. 
PM MAIL   Вверх
cardinal
Дата 15.2.2006, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 5
Всего: 99



Ты сказал "не могу разобраться с рекурсией" вот я тебе и дал ссылку. Видимо с рекурсией проблем у тебя нет. Так может в след. раз ты поумнее название темы придумаешь? smile

А так мысли такие:
Код

if((N<=1) || (N%2))
   return 0;
else if (N==2)
   return 5;
else
   return pow(5,N/2) + pow(2,N/2);

Вроде даже без рекурсии...


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
cardinal
Дата 15.2.2006, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 5
Всего: 99



А хотя нет, над правой стороной
Код

 + pow(2,N/2);

надо еще подумать...
Может так:
Код

int i=1;
int x=5;
if((N<=1) || (N%2))
   return 0;
else if (N==2)
   return 5;
else
{
   for(i=1; i<N/2-1; i++)
      x*=(x+2);
   return pow(5,N/2) + x;
}

Я все не могу посчитать в ручную сколько же комбинаций для N = 6... smile

Но еще думаю, что тут можно все таки без рекурсии...
Добавлено @ 23:08
А может и нельзя... Я в полной прострации... smile


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
cardinal
Дата 15.2.2006, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 5
Всего: 99



Во, еще мысля… Первые три числа для N=2,4,6 это помоему 5, 30, 139… Думаю, что можно теперь рекурсивно искать результат и для N=8 будет что-нибудь типа
результат = результат(6)+результат(2)…

Интересно это имел в виду esperant0. Лично ему дам плюс если просветит меня в
Цитата(esperant0 @ 15.2.2006, 19:47 Найти цитируемый пост)
динамического программирования.

smile


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
maxim1000
Дата 16.2.2006, 01:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



во-первых, нужно свести ситуацию на n-м шаге к ситуации на n-1
раскладывать плитку будем по столбикам (3 ячейки)
будем считать, что все кроме последнего столбика полностью покрыты
а то, что творится в последнем, бывает 8-ми видов (каждая ячейка может быть покрыта или нет)
рисовать все 8 ситуаций тут не буду - условимся, что номер ситуации в двоичное представлении имеет 1 там, где ячейка покрыта, и 0 там, где - нет
0 соответствует полностью непокрытому столбику
7 - полностью покрытому
1 - в котором одна крайняя ячейка покрыта и все
2 - центральная
и т.д.
теперь введем функцию - f(n,m) - количество способов разложить плитку так, чтобы n-1 столбик был покрыт полностью, а код ситуации в n-м столбике был m
таким образом стоит задача найти f(N,7)
выразим f(n,m) через ее значения на n-1 м шаге:
f(n,0)=f(n-1,7)
f(n,1)=f(n-1,6)
f(n,2)=f(n-1,5)
f(n,3)=f(n-1,7)+f(n-1,4)+f(n-1,4)
f(n,4)=f(n,1) //из-за симметрии
f(n,5)=f(n-1,2)
f(n,6)=f(n,3) //из-за симметрии
f(n,7)=3*f(n-1,0)+2*f(n-1,3)

удобнее рассмотреть соотношения этой функции не между соседними шагами, а между шагами через один - оно и понятно, на нечетных N у нас ответ и так 0
если все это дело подставить и упростить, получатся такие соотношения:

f(n,7)=5*f(n-2,7)+4*f(n-2,1)
f(n,1)=1*f(n-2,7)+2*f(n-2,1)

которые и представляют решение задачи...
Добавлено @ 02:01
теперь о том, как убрать рекурсию и соптимизировать (а другой причины убирать рекурсию тут и нету)
в том виде, в котором сейчас записано решение, количество вычислений будет расти экспоненциально при увеличении n
это почти всегда неприемлимо (исключение составляют учебные задачи, да и то не все smile)
первая оптимизация - динамическое программирование
в данном контексте (да и во многих других) оно может быть описано так "не нужно по нескольку раз пересчитывать одни и те же значения"
в нашем случае пересчет получается потому, что например f(n-2,7) нужно вычислять и при вычислении f(n,7), и при вычислении f(n,1)
это - нехорошо, лучше завести переменную, вычислить один раз f(n-2,7) и записать его туда
выразить это можно, например, с помощью умножения матрицы на вектор:
Код

(цикл n/2 раз)
{
  atemp=5*a+4*b;
  btemp=1*a+2*b;
  a=atemp;
  b=btemp;
}

тут все хорошо видно - 4 операции (неважно каких) на шаг от n-2 до n
общее количество таких операций растет линейно с увеличением n
такая скорость роста вполне приемлима в большинстве задач...


--------------------
qqq
PM WWW   Вверх
cardinal
Дата 16.2.2006, 02:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 5
Всего: 99



maxim1000, а для n=6 можно увидеть развертку рекурсии? (если честно я пока ничего не понял smile)


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
maxim1000
Дата 16.2.2006, 02:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



но это не означает, что дальше оптимизировать некуда smile
динамическое программирование - довольно общий метод, а у нас специфическая ситуация - на каждом шаге мы производим не просто операции, а линейные операции
если переписать все это в виде матричной арифметики, то получим:
x(n)=A*x(n-2)
где:
x(n)=стобец( f(n,7), f(n,1) )
A - матрица:
(5 4)
(1 2)
так что можно заменить это на
x(n)=A(n)*x(0)
здесь A(n) - A в n-ой степени
вся суть оптимизации состоит в том, что для вычисления n-ой степени матрицы достаточно не n операций, а log n...
делается это, как обычно рассказывают для вычисления целой степени числа:
если n четное - A(n)=sqr(A(n/2))
иначе - A(n)=A*sqr(A((n-1)/2))
ну и A(1)=A
на каждом шаге n уменьшается в 2 раза, количество операций - логарифмическое...

где-то тут я описывал подобные манипуляции с вычислением чисел Фибоначчи...
Добавлено @ 02:16
Цитата(cardinal @ 16.2.2006, 01:08 Найти цитируемый пост)
maxim1000, а для n=6 можно увидеть развертку рекурсии?

забыл начальные значения:
f(2,7)=5
f(2,1)=1
тогда получаем:
f(4,7)=5*5+4*1=29
f(4,1)=1*5+2*1=7

f(6,7)=5*29+4*7=173
f(6,1)=1*29+2*7=43

кстати, то, что оно не совпадает с
Цитата(cardinal @ 15.2.2006, 22:23 Найти цитируемый пост)
5, 30, 139

наводит на мысль, что там могла быть ошибка
если это так - она, скорее всего, в уравнениях, которые связывают n-1-й и n-й шаги
с несколько меньшей вероятностью - в процессе подстановки и упрощения выражений при сведении к связи n-2-го b n-го шагов...

в самом принципе, как мне кажется, ошибки нет - там все достаточно просто...


--------------------
qqq
PM WWW   Вверх
esperant0
Дата 16.2.2006, 07:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 714
Регистрация: 20.5.2005

Репутация: 4
Всего: 14



Если говорить о матричной арифметике, то для больших n, асимптотически верное решение проще получить найдя предварительно наибольшее собстеввное число матрицы, ведь возводить его в степень п, куда удобней чем саму матрицу. И на лицо ассимптотика роста


--------------------
 
 Student->Teacher Assistant ->Research assistant->Microsoft Software Development Engineer 

Пользователь получил наказание за то, что проигнорировал замечание которое было написано модератором  а затем стерто и которое он - пользователь не мог видеть. 
PM MAIL   Вверх
cardinal
Дата 16.2.2006, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 5
Всего: 99



Цитата(maxim1000 @ 16.2.2006, 00:10 Найти цитируемый пост)
наводит на мысль, что там могла быть ошибка

там это где? Я вручную пытался посчитать...


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
maxim1000
Дата 16.2.2006, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



Цитата(cardinal @ 16.2.2006, 15:22 Найти цитируемый пост)
там это где? Я вручную пытался посчитать...


Цитата(maxim1000 @ 16.2.2006, 00:50 Найти цитируемый пост)
выразим f(n,m) через ее значения на n-1 м шаге:
f(n,0)=f(n-1,7)
f(n,1)=f(n-1,6)
f(n,2)=f(n-1,5)
f(n,3)=f(n-1,7)+f(n-1,4)+f(n-1,4)
f(n,4)=f(n,1) //из-за симметрии
f(n,5)=f(n-1,2)
f(n,6)=f(n,3) //из-за симметрии
f(n,7)=3*f(n-1,0)+2*f(n-1,3)




--------------------
qqq
PM WWW   Вверх
cardinal
Дата 16.2.2006, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 5
Всего: 99



Да я вообще логоки не понял пока... smile


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Jilian
Дата 16.2.2006, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 24.1.2005
Где: Минск

Репутация: нет
Всего: нет



Дело в том, что эту задачу надо ОБЯЗАТЕЛЬНО решить рекурсивно. А с рекурсией я не могу разобраться конкретно в этой задаче. Так что не надо осуждать моё название, ОК? -)
Спасибо всем большое за посты. Сейчас со всем ознакомлюсь. Ясно, что при нечетных N решений не будет. Но уже при N=4, таких плиток много... Сегодня на лекциях сидела рисовала... Проверить правильность сложно...

2 cardinal
Не "сказал", а "сказала". -)
Добавлено @ 20:40
Цитата

а то, что творится в последнем, бывает 8-ми видов (каждая ячейка может быть покрыта или нет)


допустим 0 - ничего нету, 1 - это кусочек плитки 2Х1, а 2 - кусочек плитки 2Х2
2 0 1 0 1 0
2 2 1 1 0 0
0 2 0 1 0 1
(1) (2) (3) (4) (5) (6)

Вопросик:
зачем же нам 7-я и 8-я ситуации?
1
0
1 (7)
это невозможная ситуация, т.к. при её создании укладку нельзя завершить
а рассматриваение
0
0
0 (8)
на мой взгляд не имеет смысла

Это сообщение отредактировал(а) Jilian - 16.2.2006, 20:29
PM MAIL   Вверх
cardinal
Дата 16.2.2006, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 5
Всего: 99



Цитата(Jilian @ 16.2.2006, 18:26 Найти цитируемый пост)
Не "сказал", а "сказала". -)

Пардон. smile


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
maxim1000
Дата 16.2.2006, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



Цитата(Jilian @ 16.2.2006, 19:26 Найти цитируемый пост)
, а 2 - кусочек плитки 2Х2

а какая разница, кусочек какой плитки покрывает ячейку
важно покрыта она или нет

Цитата(Jilian @ 16.2.2006, 19:26 Найти цитируемый пост)
это невозможная ситуация, т.к. при её создании укладку нельзя завершить

да, нельзя, просто упомянул ее для полноты в начале рассуждения
а потом, когда выписывались выражения для интересующих нас ситуаций эти не участвовали...

Цитата(Jilian @ 16.2.2006, 19:26 Найти цитируемый пост)
на мой взгляд не имеет смысла

опять же чисто для удобства, в конце она пропадает...

просто если ее не рассматривать, придется сразу выводить соотношения между n-2-м и n-м шагами... возможно, это даже и лучше, но тогда я рассуждал через сотношения между n-1-м и n-м шагами...

в конце концов, можно посмотреть на
Цитата(maxim1000 @ 16.2.2006, 00:50 Найти цитируемый пост)
f(n,7)=5*f(n-2,7)+4*f(n-2,1)
f(n,1)=1*f(n-2,7)+2*f(n-2,1)

не обращая внимания на промежуточный этап
может, так даже и проще получится
рассуждения не всегда получается сразу вести кратчайшим путем smile

Цитата(cardinal @ 16.2.2006, 16:51 Найти цитируемый пост)
Да я вообще логоки не понял пока...

логика простая - выделяем несколько последних операций так, чтобы количество способов ожно было легко посчитать (в данном случае я пошел по столбикам), а все остальное сводим к решению задачи для меньших n...


--------------------
qqq
PM WWW   Вверх
Jilian
Дата 16.2.2006, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 24.1.2005
Где: Минск

Репутация: нет
Всего: нет



Но дело еще в том, что прога должна пройти по времени и сложности алгоритма... Т.к. прогу проверяет не препод, а система.
PM MAIL   Вверх
Jilian
Дата 18.2.2006, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 24.1.2005
Где: Минск

Репутация: нет
Всего: нет



Вот правильное решение:
Код

unsigned long F(unsigned int i, unsigned int a1, unsigned int a2, unsigned int a3)
{ 
    if((i == 2) && (a1 == 0) && (a2 == 0) && (a3 == 0))
        return 5;

    if(((i == 0) && (a1 == 0) && (a2 == 1) && (a3 == 1)) ||
       ((i == 0) && (a1 == 1) && (a2 == 1) && (a3 == 0)))
        return 1;

    if((a1 == 0) && (a2 == 0) && (a3 == 0))
        return 3 * F(i-2,0,0,0) + F(i-2,0,1,1) + F(i-2,1,1,0);

    if((a1 == 1) && (a2 == 1) && (a3 == 0))
        return 2 * F(i-2,1,1,0) + F(i,0,0,0);

    if((a1 == 0) && (a2 == 1) && (a3 == 1))
        return 2 * F(i-2,1,1,0) + F(i,0,0,0);

    return 0;
}

PM MAIL   Вверх
Jilian
Дата 22.2.2006, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 24.1.2005
Где: Минск

Репутация: нет
Всего: нет



Интересно, а как оценить сверху чисто таких расстановок плиток?
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.1742 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.