Форум программистов, компьютерный форум, киберфорум
Наши страницы
Алгоритмы
Войти
Регистрация
Восстановить пароль
 
_Milo
0 / 0 / 0
Регистрация: 17.11.2015
Сообщений: 5
1

Правильные скобочные последовательности

08.12.2018, 18:49. Просмотров 414. Ответов 2

Здравствуйте. Помогите, пожалуйста, с задачей.

Ограничение по времени работы: 1 секунда

Посчитайте количество правильных скобочных последовательностей длины 2n (n открывающих скобок и n закрывающих), составленных из круглых и квадратных скобок так, что внутри любой пары круглых скобок нет квадратных скобок.

Входные данные
В единственной строке через пробел записано целое неотрицательное число n, не превосходящее 1000.

Выходные данные
Выведите остаток от деления количества искомых правильных скобочных последовательностей на 10^9 + 7.

Пример:
Ввод : 1 | 2
Вывод: 2 | 7

Мое решение:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
 
void gen_psp(int N, int balance_r, int balance_s, int o_br, int c_br, long long& count) {
    //std::cout << balance_r << ' ' << balance_s << ' ' << o_br << ' ' << c_br << std::endl;
    if (c_br == N) {
        ++count;
        //std::cout << str << std::endl;
    }
    else {
        if (o_br < N) {
            gen_psp(N, balance_r + 1, balance_s, o_br + 1, c_br, count);//добавляю (
 
            if (balance_r == 0) {
                gen_psp(N, balance_r, balance_s + 1, o_br + 1, c_br, count);//добавляю [
            }
        }
        if (o_br > c_br) {
            if (balance_r > 0) {
                gen_psp(N, balance_r - 1, balance_s, o_br, c_br + 1, count);//добавляю )
            }
 
            if (balance_s > 0 && balance_r == 0) {
                gen_psp(N, balance_r, balance_s - 1, o_br, c_br + 1, count);//добавляю ]
            }
        }
    }
}
 
int main() {
    int N = 0;
    std::cin >> N;
 
    long long count = 0;
    gen_psp(N, 0, 0, 0, 0, count);
    std::cout << coun % delt;
}
Мне кажется, что мое решение верно, т.е. выдает верное количество искомых последовательностей. Но работает очень медленно и летит по времени, т.к. уже при n = 12 программа работает дольше 1 секунды.

У меня два вопроса:
1. Видимо, существует более быстрая реализация или алгоритм, но я не приложу ума какие. Буду признателен за подсказку.
2. Мне также не совсем понятно, как нужно хранить ответ. Для больших n, мне кажется, long long не сможет вместить количество последовательностей.

Спасибо.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.12.2018, 18:49
Ответы с готовыми решениями:

Вывести все правильные скобочные выражения (оптимизировать алгоритм, ускорить работу кода)
есть код, нужно cout и cin перевести на printf и scanf дополнительных библиотек не подключать!...

Вывести все правильные скобочные выражения длиной N, состоящие из круглых и квадратных скобок
Вывести все правильные скобочные выражения длиной N, состоящие из круглых и квадратных скобок. ...

Вывести все правильные скобочные выражения длины N, состоящие из круглых и квадратных скобок
Здравствуйте! Решил данную задачу, но один тест не проходит по времени...Можно ли как-то...

Скобочные последовательности
Вот несколько задачек, помогите пожалуйста: 1) Пользователь вводит строку. Удалить все...

Delphi скобочные последовательности
По данному натуральному n определите количество правильных скобочных последовательностей длины 2n,...

2
Shamil1
Модератор
2269 / 1562 / 352
Регистрация: 26.03.2015
Сообщений: 5,635
08.12.2018, 19:34 2
Цитата Сообщение от _Milo Посмотреть сообщение
как нужно хранить ответ
По модулю (сразу делите на 10^9 + 7).
0
vantfiles
164 / 85 / 35
Регистрация: 07.05.2013
Сообщений: 298
10.12.2018, 12:54 3
> 1. Видимо, существует более быстрая реализация

Как это ни странно прозвучит, но в си одна из самых наклАдных по времени операций - это вызов функции, который можно еще и усугубИть большим количеством передаваемых параметров.

Как мне кажется, в этом направлении вам следует или уменьшить к-во параметров - например передавать структуру - или отказаться от рекурсии вообще и попытаться решить задачу циклом.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.12.2018, 12:54

Тестер. Как выделить правильные ответы зелёным, а не правильные красным?
Здравствуйте программисты!! у меня такая проблема. Как можно сделать в режиме обучения: 1. Чтобы...

Скобочные подпоследовательности.
Однажды Васе попалась скобочная последовательность. Он решил удалить из нее некоторые скобки так,...

правильные Ip-адреса
Всем привет! Проблема такова: на главном компе 2 сетевых карточки, раньше раздавал интернет. Все...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru