Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.10.2022, 20:55   #1
Eida
Новичок
Джуниор
 
Регистрация: 25.10.2022
Сообщений: 1
По умолчанию Динамическое программирование, задача про роботов

[динамическое программирование]

В Умном городе сортировкой стеклотары занимаются роботы. Их задача - разделить бутылки на темные и светлые.

Сортировка происходит так: n бутылок стоят на конвейере, два робота одновременно захватывают бутылки с начала конвейере и сбрасывают их в контейнеры; после этого лента конвейера движется, и роботам доступны следующие бутылки. Один робот работает с темными бутылками, а другой - со светлыми. Каждый робот может взять не более k бутылок. Поэтому, если на конвейере стоят подряд более чем k бутылок одного цвета, одному из роботов нечего взять с конвейера.

В Умном городе не любят, когда роботы простаивают, и самим роботам это тоже не нравится. Поэтому всех интересует вопрос: сколько существует вариантов расстановки n бутылок так, чтобы бутылок одного цвета, стоящих подряд, было не более чем k. Ответьте на этот вопрос.



Пример. n=4, k=2. Есть 10 вариантов:

TTCT TTCC TCTT TCTC TCCT CTTC

CTCT CTCC CCTT CCTC



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

В единственной строке входных данных заданы два целых числа n, k (1 <= n, k <= 10^6) (1 <= nk <= 10^6)



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

Единственное целое число — ответ на задачу. Так как ответ может быть очень большим числом, выведите его по модулю 10^9 + 7

Sample Input:

4 2
Sample Output:

10


Напишите код, пожалуйста
Eida вне форума Ответить с цитированием
Старый 26.10.2022, 06:31   #2
Пётр Седов
Форумчанин
 
Регистрация: 26.10.2022
Сообщений: 119
По умолчанию

Пока приходит на ум вот такой простой код:
Код:
#include <assert.h>
#include <iostream>
#include <vector>

using namespace std;

enum bottle_type_t {_bottle_type_light, _bottle_type_dark};

int _bottles_count; // n
int _max_mono_len; // k
vector<bottle_type_t> _bottles;
int _valid_cases_count = 0;

void place_light_bottles(int start_pos);
void place_dark_bottles(int start_pos);
void add_valid_case();

int main() {
  cin >> _bottles_count >> _max_mono_len;
  _bottles.resize(_bottles_count);
  place_light_bottles(0);
  _valid_cases_count *= 2; // вместо "place_dark_bottles(0)"
  cout << "valid cases count = " << _valid_cases_count << endl;
  return 0;
}

void place_light_bottles(int start_pos) {
  assert(start_pos < _bottles_count);
  for (int i = 0; i < _max_mono_len; i++) {
    _bottles[start_pos + i] = _bottle_type_light;
    if (start_pos + i + 1 == _bottles_count) { // если дошли до конца
      add_valid_case();
      break;
    }
    // за светлыми бутылками размещаем тёмные бутылки
    place_dark_bottles(start_pos + i + 1);
  }
}

void place_dark_bottles(int start_pos) {
  assert(start_pos < _bottles_count);
  for (int i = 0; i < _max_mono_len; i++) {
    _bottles[start_pos + i] = _bottle_type_dark;
    if (start_pos + i + 1 == _bottles_count) { // если дошли до конца
      add_valid_case();
      break;
    }
    // за тёмными бутылками размещаем светлые бутылки
    place_light_bottles(start_pos + i + 1);
  }
}

void add_valid_case() {
  // выводим на консоль подходящий вариант расстановки бутылок (для отладки)
  for (int i = 0; i < _bottles_count; i++) {
    switch (_bottles[i]) {
    case _bottle_type_light: {cout << 'l'; break;}
    case _bottle_type_dark: {cout << 'd'; break;}
    }
  }
  cout << endl;

  _valid_cases_count++;
}
Но это не динамическое программирование, будет медленно работать для больших n. Проверку на переполнение (overflow) не делал.
Пётр Седов вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамическое программирование. Задача о ресурсах. delaimo Общие вопросы Delphi 15 04.06.2014 18:51
Задача на динамическое программирование makskovalko Помощь студентам 2 29.01.2014 22:25
Динамическое программирование, Visual C#/C++, задача о рюкзаке fanpilot Помощь студентам 0 21.12.2011 23:13
Задача на динамическое программирование) Андрей1010 Паскаль, Turbo Pascal, PascalABC.NET 4 11.10.2011 13:56
Задача на динамическое программирование Римма1990 Помощь студентам 2 02.04.2009 23:11