![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() ![]() |
![]() |
first_day |
![]() ![]()
Сообщение
#1
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 86 Пол: Мужской Реальное имя: Илья Репутация: ![]() ![]() ![]() |
Задача: необходимо найти кол-во возможных вариантов постройки пирамиды, если основание n кубиков, а высота k кубиков. Каждый следующий ряд можно уложить только так, чтобы слеа и справа был хотя бы 1 свободный кубик.
Идея у меня такая: поднимаясь на следующую ступеньку, ставим n-2 кубиков (это становится новое основание), дальше пытаемся сдвинуть эту группу кубиков вправо, попутно проверяя возможность подняться наверх. Уменьшаем эту группу на 1, повторяем. Если какой-то из функций достигается нужный уровень, т.е. k, то кол-во вариантов увеличиваем. Рекурсию никогда раньше не использовал, попробова, вот, что получилось: #include <iostream> Выдает либо 0, либо 1... Сообщение отредактировано: first_day - 19.12.2007 14:27 Эскизы прикрепленных изображений ![]() -------------------- Я бы изменил мир, да Бог не дает исходников.
|
Michael_Rybak |
![]()
Сообщение
#2
|
Michael_Rybak ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 1 046 Пол: Мужской Реальное имя: Michael_Rybak Репутация: ![]() ![]() ![]() |
Ой, столько промежуточных переменных... Если уж их заводишь, старайся давать осмысленные имена, иначе читать лень
![]() Я не разбирался почему не работает, просто предлагаю свой вариант. Несложно убедиться, что f(n, k) = f(n - 2, k - n) * 1 + f(n - 3, k - n) * 2 + f(n - 4, k - n) * 3 + ... Поэтому можно без всякой рекурсии просто заполнить табличку значений для f: for (int n = ...) |
Atos |
![]()
Сообщение
#3
|
![]() Прогрессор ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 602 Пол: Мужской Реальное имя: Михаил Репутация: ![]() ![]() ![]() |
Вот, навскидку, вижу строчку:
if ((r-l>2) && (st<=y)) step(size,y,st); //подъем наверх А где используется результат? Может, надо if ((r-l>2) && (st<=y)) sum+=step(size,y,st); //подъем наверх |
first_day |
![]()
Сообщение
#4
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 86 Пол: Мужской Реальное имя: Илья Репутация: ![]() ![]() ![]() |
Цитата где используется результат? Вроде, нет. Мне нужно, чтобы в этом месте вызывалась функция, которая знала лишь номер ступеньки на которой она "находится", макс. кол-во ступенек и кол-во кубиков в основании. Т.е. каждая из подпрограмм должна передать результат либо 1 (если она достигла последней требуемой ступеньки), либо 0. Цитата Несложно убедиться, что f(n, k) = f(n - 2, k - n) * 1 + f(n - 3, k - n) * 2 + f(n - 4, k - n) * 3 + ... Поэтому можно без всякой рекурсии просто заполнить табличку значений для f:
А почему k-n? если изначально будет n=5, k=2, тогда как? И т.е. первые 2 цикла завершатся, когда завершится 3-ий(с параметром i)? А третий завершится тогд, когда (k - n) станет равно 0? Сообщение отредактировано: first_day - 19.12.2007 18:14 -------------------- Я бы изменил мир, да Бог не дает исходников.
|
Michael_Rybak |
![]()
Сообщение
#5
|
Michael_Rybak ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 1 046 Пол: Мужской Реальное имя: Michael_Rybak Репутация: ![]() ![]() ![]() |
Сори, я решил почему-то, что k - общее количество кубиков в пирамиде.
Раз k - высота, то там везде нужно не k - n, а k - 1. И если k = 1, то f[k][n] = 1 для всех n. |
first_day |
![]()
Сообщение
#6
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 86 Пол: Мужской Реальное имя: Илья Репутация: ![]() ![]() ![]() |
Что-то не очень пойму... ну вот например n=5, k=2;
f(n,k) = (5-2-0)(2-1)*1+(5-2-1)(k-2)*(1+1) Получается (3)(1)+(4)(0) = (7)(1) - Так? И что из этого кол-во вариантов? -------------------- Я бы изменил мир, да Бог не дает исходников.
|
Michael_Rybak |
![]()
Сообщение
#7
|
Michael_Rybak ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 1 046 Пол: Мужской Реальное имя: Michael_Rybak Репутация: ![]() ![]() ![]() |
f(n, k) = f(n - 2, k - 1) * 1 + f(n - 3, k - 1) * 2 + f(n - 4, k - 1) * 3 + ...
f(5, 2) = f(5 - 2, 2 - 1) * 1 + f(5 - 3, 2 - 1) * 2 + f(5 - 4, 2 - 1) * 3 f(5, 2) = f(3, 1) * 1 + f(2, 1) * 2 + f(1, 1) * 3 Чтобы посчитать f(5, 2), нужно сначала посчитать f(3, 1), f(2, 1) и f(1, 1). |
![]() ![]() |
![]() |
Текстовая версия | 27.07.2025 2:17 |