С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
670 / 198 / 29
Регистрация: 10.05.2012
Сообщений: 595
1

ДП Динамическое программирование

01.11.2012, 21:59. Показов 3151. Ответов 2

Author24 — интернет-сервис помощи студентам
ограничение времени на тест: 0.5 сек.
ограничение памяти на тест: 65536 KB.

Рассмотрим все строки длины N, состоящие только из букв 'a' и 'b', в которых никакие две буквы 'b' не идут подряд. Упорядочим их в алфавитном порядке. Вам необходимо найти K-ю строку в упорядоченном списке.

Входные данные
Числа N (1 <= N <= 90) и K (K >= 1). Гарантируется, что K не превосходит общего числа рассматриваемых строк.

Выходные данные
Выведите искомую строку.

Пример

Ввод
3 5

Вывод
bab
{------------------------------------------}
Вот моё решение:
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
#include <iostream>
#include <cmath>
#include <vector>
#include <bitset>
 
using namespace std;
 
vector <unsigned long long> fib(2, 1);
 
unsigned long long calc(long long k){
    int j = 0;
    if (k == 0) return 0;
    if (k == 1) return 1;
    while (fib[j] <= k) 
        j++;
    j--;
    unsigned long long c = fib[j];
    return pow(2, double(j-1)) + calc(k-c);
}
int main(){ 
    int n;
    unsigned long long k;
    cin >> n >> k;
    for (int i = 2; i <= n+1; i++){
        fib.push_back(fib[i-1] + fib[i-2]);
    }
    unsigned long long temp = calc(k-1);
    bitset<100> c = temp;
    for (int i = n-1; i >= 0; i--)
        cout << ((c[i])?'b':'a');
    return 0;
}
1) Я заметил, что начиная с 78 числа Фибоначчи в векторе fib значения уже неправильные, хотя в ulong long вмещается
2) Проходит 29 из 50 тестов c ошибкой wrong answer
3) Можно ли перевести в bitset ulonglong ?
Разъясню алгоритм:
а = 0; b = 1;
строки длины 4
____
0000 = 0
____
0001 = 1
____
0010 = 2
____
0100 = 4
0101 = 5
____
1000 = 8
1001 = 9
1010 = 10
____
и так далее
1) видно, что длина пака - это число фибоначчи
1.5) собсно терь перевидём всё в 10-ю запись
2) теперь видно, что начиная со 2-ой пачки z[k] = 2^j + z[i], где i [0..fib[j]]
3) Но так как длина z будет очень большой замутим рекурсию.
х3 в чём ошибка

Добавлено через 7 минут
и k [2^j..2^j + fib[j]]

Добавлено через 3 минуты
Ой!!! Т.Е : z[i] = 2^j + z[i - fib[j]], по i [0..fib[j-1])
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.11.2012, 21:59
Ответы с готовыми решениями:

Динамическое программирование
Не понимаю динамических структур, списков, работы с ними. Посоветуйте источник изучения. Что-то...

Динамическое программирование
Помогите пожалуйста,кто может, со следующими задачами, так как в С++ слабо разбираюсь, а к...

Динамическое программирование
Столкнулся с такой задачей. Есть 6 фигурок площадью 3. Нужно узнать, сколькими способами можно...

Динамическое программирование
народ помогите пожалуйста. есть задача Написать программу, позволяющую вычислить количество...

2
Эксперт С++
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
02.11.2012, 06:11 2
Цитата Сообщение от Ternsip Посмотреть сообщение
1) Я заметил, что начиная с 78 числа Фибоначчи в векторе fib значения уже неправильные, хотя в ulong long вмещается
да вроде все правильно.

Цитата Сообщение от Ternsip Посмотреть сообщение
2) Проходит 29 из 50 тестов c ошибкой wrong answer
я думаю, что ошибка здесь (при определенных значениях скорее всего теряется точность):
Цитата Сообщение от Ternsip Посмотреть сообщение
unsigned long long calc(long long k){
int j = 0;
if (k == 0) return 0;
if (k == 1) return 1;
while (fib[j] <= k)
j++;
j--;
unsigned long long c = fib[j];
return pow(2, double(j-1)) + calc(k-c);
}
Цитата Сообщение от Ternsip Посмотреть сообщение
Можно ли перевести в bitset ulonglong ?
А есть смысл. Попробуйте такой (более простой) вариант:
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
#include <iostream>
#include <cmath>
#include <vector>
#include <bitset>
 
using namespace std;
 
vector <unsigned long long> fib(2, 1);
 
int main(){ 
    int n;
    unsigned long long k;
    cin >> n >> k;
    for (int i = 2; i <= n+1; i++){
        fib.push_back(fib[i-1] + fib[i-2]);
    }
    for(int i=n; i>0; i--)
        if(k-1>=fib[i])
        {
            cout<<'b';
            k-=fib[i];
        }
        else
            cout<<'a';
    cout<<endl;
    return 0;
}
4
670 / 198 / 29
Регистрация: 10.05.2012
Сообщений: 595
02.11.2012, 10:06  [ТС] 3
valeriikozlov, Спаибо! Вы большой молодец! работает Поставил бы 3 лайка
1
02.11.2012, 10:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.11.2012, 10:06
Помогаю со студенческими работами здесь

Динамическое программирование
Ограничение по времени: 2 секунды Ограничение по памяти: 256 мегабайт У Пети есть полоска...

Динамическое программирование!
#include &lt;cstdio&gt; #include &lt;algorithm&gt; using namespace std; int a, n, m; int main() {...

Динамическое программирование.
Помогите, пожалуйста, составить алгоритм по одному из ниже представленных заданий, используя методы...

Динамическое программирование
Есть такая задача: Дана схема стены, необходимо проверить можно ли построить данную стену заданным...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru