Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
#1

Поиск максимальной последовательности в другой последовательности - C++

17.08.2011, 16:32. Просмотров 1109. Ответов 7
Метки нет (Все метки)

Доброго времени суток.
Решая эту задачу, наткнулся на небольшую проблему...
Не знаю, как точно описать ее в двух словах, поэтому покажу на примере.
Допустим, мы имеем последовательность, хранящуюся в массиве(векторе):

2 0 4 4 3 4 4 4 4 2

Мне нужно найти в ней такую последовательность, чтобы произведение минимального элемента этой последовательности и количество элементов в ней было максимальным.
Из вышеприведенного примера максимальная последовательность будет такой:

4 4 3 4 4 4 4

Минимальный элемент - 3, количество элементов - 7, произведение - 21.

В голову лезут только быдлоалгоритмы, которые я едва ли смогу реализовать, не говоря уже о эффективности. А эффективность очень важна, т.к. такую функцию мне нужно будет применить ко всем строкам матрицы размером до 1000*1000.
Поэтому просьба поделиться кодом/алгоритмом/идеей решения.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.08.2011, 16:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Поиск максимальной последовательности в другой последовательности (C++):

Поиск последовательности элементов максимальной длины в массиве - C++
Помогите пожалуйста написать программу, вот условия программы...Даны два массива. Напишите программу, которая находит такую...

В последовательности найти числа, которые близки к числам другой последовательности - C++
даны две последовательности чисел A = {a1, a2,…, an}, B = {b1, b2, …, bn},напечатать те и только те числа aj из последовательности A, для...

Найти числа из заданной последовательности, которые делятся на все числа из другой последовательности - C++
Вход программы имеет следующий формат. Сначала вводится N > 0- количество чисел в последовательности А. Далее идут N целых чисел. После...

Найти длину максимальной последовательности чисел, которые идут по порядку - C++
То есть если дан ряд 1 3 8 9 2 3 4 3 4 4 3 то выведет, что самая длинная последовательность состоит из 3 элементов (если не сложно,...

В заданной последовательности чисел найти убывающую последовательность максимальной длины - C++
Даны N целых чисел. В заданной последовательности чисел найти убывающую последовательность максимальной длины. Формат входных данных Во...

Определить длину содержащейся в тексте максимальной последовательности символов, отличных от букв - C++
для заданного текста определить длину содержащейся в нём максимальной последовательности символов, отличных от букв.Помогите пожалуйста...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
-=ЮрА=-
Заблокирован
Автор FAQ
17.08.2011, 16:40 #2
А что если тривиально решить - нашили минимальный и умножили на число элементов, ведь кол-во элементов неизменно а минимальное произведение при постоянном сомножителе будет при минимальном независимом множителе
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,282
Записей в блоге: 2
Завершенные тесты: 1
17.08.2011, 16:45 #3
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
А что если тривиально решить - нашили минимальный и умножили на число элементов, ведь кол-во элементов неизменно а минимальное произведение при постоянном сомножителе будет при минимальном независимом множителе
Если взять всю последовательность то минимальным будет 0, а если один множитель 0, то и произведение - 0.
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
17.08.2011, 16:47  [ТС] #4
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
А что если тривиально решить - нашили минимальный и умножили на число элементов, ведь кол-во элементов неизменно а минимальное произведение при постоянном сомножителе будет при минимальном независимом множителе
Не понял немного... Там вполне могут быть нули.
P.S. забыл добавить - элементы должны быть расположены последовательно.
-=ЮрА=-
Заблокирован
Автор FAQ
17.08.2011, 21:12 #5
Цитата Сообщение от diagon Посмотреть сообщение
Не понял немного... Там вполне могут быть нули.
- хорошо работаем с диапазоном чисел (0;+INF) остальные отбрасываем при анализе

Я вёл к тому что
1230456
if(vector[i] != 0)
ищем минимальный,
затем
min*7
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
17.08.2011, 21:51  [ТС] #6
Не пойдет, числа должны идти последовательно, т.е. исключать элементы посреди последовательности нельзя.

Добавлено через 37 минут
Сдал через быдлоперебор, по идее асимптотика должна быть O(n * n * logn * m) в худшем случае(когда вся матрица из единиц).
Краткая идея решения задачи по ссылке в первом посте - в комментариях.
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/*Найти в матрице nхm, состоящую из нулей и единиц, максимальную по площади подматрицу, состоящую только из единиц. */
 
#include <iostream>
#include <vector>
#include <algorithm>
 
/* Поиск наибольшей последовательности в векторе, произведение 
 * минимального элемента и количества элементов которой максимально. 
 */
int max_mult(const std::vector<int>& arr){
    
    int res = 0;
    
    for (size_t i = 0; i < arr.size(); ++i)
    {
        if (arr[i] == 0)
            continue;
        for (int j = i, len = 1, min = arr[i]; j < (int) arr.size(); ++j, ++len)
        {
            if (arr[j] == 0)
                break;
                
            min = std::min(min, arr[j]);
            res = std::max(res, min * len);
        }
    }
    return res; 
}
 
int main(){
    //freopen("input.txt", "r", stdin);
    //freopen("output.txt", "w", stdout);
    int n, m;
    std::cin >> n >> m;
    std::vector< std::vector<int> > matrix(n, std::vector<int> (m) );
    int ans = 0;
    for (size_t i = 0; i < matrix.size(); ++i)
    {
        /* В элементе matrix[i][j] будет хранится количество
         * последовательных единиц находится выше этого элемента, 
         * включая этот элемент
         */
        for (size_t j = 0; j < matrix[0].size(); ++j)
        {
            char ch;
            std::cin >> ch;
            
            switch( ch )
            {
                case '0' :
                    matrix[i][j] = 0;
                    break;
                case '1':
                    if ( i )
                        matrix[i][j] = matrix[i-1][j] + 1;
                    else
                        matrix[i][j] = 1;
                    break;
                default:
                    std::cerr << "Incorrect input!\n";
                    return 1;               
            }
        }
        /* Для каждой строки находим максимальную по площади подматрицу,
         * нижняя сторона которой лежит в строке i
         */
        ans = std::max(ans, max_mult(matrix[i]) );  
    }   
    
    std::cout << ans;
}
Спасибо всем, кто откликнулся.
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,282
Записей в блоге: 2
Завершенные тесты: 1
17.08.2011, 22:22 #7
Цитата Сообщение от diagon Посмотреть сообщение
Сдал через быдлоперебор, по идее асимптотика должна быть O(n * n * logn * m) в худшем случае(когда вся матрица из единиц).
Интересный жаргон, в то время когда по научному быдлоперебор - прекальк
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
18.08.2011, 06:37  [ТС] #8
Цитата Сообщение от Dani Посмотреть сообщение
Интересный жаргон, в то время когда по научному быдлоперебор - прекальк
Да какой здесь прекальк, я просто n раз бежал по строке, где n - ее длина.
Надеялся, что можно было перебрать ее динамикой за nlogn хотя бы.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.08.2011, 06:37
Привет! Вот еще темы с ответами:

Найти, сколько членов первой последовательности совпадает с членами второй последовательности - C++
Даны две последовательности целых чисел а1 и а2 an и b1 и b2 bn. Все члены последовательностей различные числа. Найти, сколько членов...

Построить элементы в убывающей последовательности и вывести первоначальные индексы последовательности - C++
Здравствуйте, уважаемые форумчане!! Помогите разобраться с лабораторной работой Задача -&gt; Построить элементы в убывающей...

В последовательности Фибоначчи найти индекс члена последовательности, удовлетворяющего условию - C++
помогите не могу найти ошибку вводится число A,найти номер К такого числа Фибоначчи ,что Xк-1&lt;=A&lt;Xк. #include &lt;iostream&gt; ...

Вывод последовательности, определяющий, являются ли простыми/совершенными соответствующие элементы введённой последовательности - C++
Никак не приходит в голову, как составить алгоритм, реализующий проверку на то, является ли число простым и является ли совершенным. Если...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
18.08.2011, 06:37
Ответ Создать тему
Опции темы

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