Предмет: Информатика, автор: koko896

Вам нужно выложить плиткой А * 2 коридора.
Существует 2 вида плитки:
1) 1*1,
2) Г-образный
Напишите код c++ который посчитает сколько существует различных способов вымостить коридор. К примеру если А=2 тогда ответ должен быть 5.

Приложения:

Ответы

Автор ответа: antarctica123
0

Відповідь:

#include <iostream>

using namespace std;

int main() {

   int n, f1 = 1, f2 = 2, f3; // начальные значения

   cin >> n;

   if (n == 1) cout << f1; // отдельный случай для n=1

   else if (n == 2) cout << f2; // отдельный случай для n=2

   else {

       for (int i = 3; i <= n; i++) {

           f3 = f1 + f2;

           f1 = f2;

           f2 = f3;

       }

       cout << f3; // результат

   }

   return 0;

}

Пояснення:


koko896: Но если а=2 то должно быть 5 а здесь ответ 2(((
Автор ответа: nurbekjonakhmatov
0

Ответ:

Для решения данной задачи можно использовать динамическое программирование. Создадим массив dp размера A+1, где dp[i] будет хранить количество способов вымостить коридор длины i. Изначально все элементы dp установим в 0.

Для i=1 dp[i] равно 1, так как существует только один способ вымостить коридор длины 1.

Для i=2 dp[i] равно 3, так как существует три способа вымостить коридор длины 2: двумя плитками 1*1, одной плиткой Г-образной или двумя плитками Г-образными.

Для i>2 мы можем выложить первую плитку либо 11, либо Г-образную. Если мы выложили плитку 11, то оставшуюся часть коридора нужно вымостить способом, который соответствует длине i-1, то есть dp[i-1]. Если мы выложили Г-образную плитку, то оставшуюся часть коридора нужно вымостить способом, который соответствует длине i-2, то есть dp[i-2]. Таким образом, мы можем записать рекуррентную формулу:

dp[i] = dp[i-1] + dp[i-2]

Наша цель - посчитать dp[A]. Для этого нам необходимо заполнить массив dp начиная с dp[3] по формуле выше.

Вот код на C++:

#include <iostream>

using namespace std;

int main() {

   int A;

   cin >> A;

   int dp[A+1];

   dp[1] = 1;

   dp[2] = 3;

   for (int i = 3; i <= A; i++) {

       dp[i] = dp[i-1] + dp[i-2];

   }

   cout << dp[A] << endl;

   return 0;

}

Объяснение:

Пример работы программы:

Input:

2

Output:

5

Input:

4

Output:

11


koko896: Eсли а=2 то должно быть 5 а здесь ответ 3
Похожие вопросы
Предмет: Алгебра, автор: mykytaxiaomi
Предмет: Физика, автор: user22018442
Хід роботи 1. Визначте ціну поділки шкали лінійки С, мензурки См, вимірюваль- ного циліндра Свца 2. Виміряйте лінійкою довжину, ширину і висоту тіла правильної фор- ми. За формулою V = abc визначте його об'єм. 3. У мензурку або вимірювальний циліндр налийте води. Зафіксуйте її об'єм V1. Візьміть тіло неправильної форми і занурте його повністю у воду. Зафіксуйте об'єм води з тілом неправильної форми V2. Визначте об'єм зануреного тіла V = V2 - V1. 4. Налийте по черзі води в кожну з посудин, а потім за допомогою мен- зурки (вимірювального циліндра) виміряйте їх об'єми: V1, V, Vз і т. д. 3 5. у мензурку насипте пшона (гречки, гороху). Налийте в мензурку з пшоном (гречкою, горохом) води так, щоб вона повністю його покрила. Зафіксуйте об'єм води з пшоном (гречкою, горохом) V2. Обережно злийте воду у вимірювальний циліндр, виміряйте її об'єм V1. Визначте об'єм пшона (гречки, гороху) V = V2-V1. 6. Усі результати вимірювання запишіть у вигляді V = (Vo ± AV). = 7. Розгляньте мірну склянку (побутову). З'ясуйте, які шкали на ній нанесено. Об'єм яких речовин можна виміряти за її допомогою? ​