Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

ПРОШУ ПОМОГИТЕ С++

leyla nuriyeva Ученик (86), открыт 3 недели назад
Лесенкой называется набор кубиков, в котором каждый горизонтальный слой содержит меньше кубиков, чем слой под ним.
Подсчитать количество различных лесенок, которые могут быть построены из N кубиков.
Входные данные

1
Результат работы

1
Входные данные

3
Результат работы

2
2 ответа
Иван Б. Мыслитель (5116) 3 недели назад
Один из вариантов решения этой задачи на C++:

#include <fstream>
using namespace std;

int get_count(int prev_level, int n) {
if (0 == n) return 1;
int count = 0;
for (int level = 1; level < prev_level; ++level) {
count += get_count(level, n - level);
}
return count;
}

int main() {
ifstream ifst("input.txt");
ofstream ofst("output.txt");
int n, count = 0;
ifst >> n;
for (int level = 1; level <= n; ++level) {
count += get_count(level, n-level);
}
}
В функции main выполняется генерация кубиков в первом уровне. В нём может быть от 1 до n кубиков. Функция get_count возвращает единицу, если количество кубиков равно нулю — то есть лесенку удалось сгенерировать. Для остальных случаев запускается рекурсивная функция с различными наборами данных, уменьшая количество кубиков на текущем уровне и увеличивая на следующем.
leyla nuriyevaУченик (86) 3 недели назад
первый ест не прошло
Иван Б. Мыслитель (5116) leyla nuriyeva, Чтобы решить проблему с прохождением первого теста, можно добавить проверку в функцию get_count. Она много раз вызывается для отрицательных значений количества кубиков на уровне (n). Нужно проверить, что n - level больше нуля. Также можно использовать решение методом динамического программирования. Оно работает быстрее и потребляет меньше памяти, чем рекурсивный вариант.
leyla nuriyevaУченик (86) 3 недели назад
*тест
Resurce InheiT Профи (927) 3 недели назад
 #include <iostream> 
#include <vector>

using namespace std;

int countLadders(int n) {
vector<int> dp(n + 1, 0);
dp[0] = 1;

for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= i; ++j) {
dp[i] += dp[i - j];
}
}

int result = 0;
for (int i = 1; i <= n; ++i) {
result += dp[n - i];
}

return result;
}


int main() {
int n;
cin >> n;
cout << countLadders(n) << endl;
return 0;
}
Похожие вопросы