Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
TF
0 / 0 / 0
Регистрация: 20.03.2013
Сообщений: 101

Рекурсия: найти непрерывную часть массива, чтобы сумма элементов была максимальной

31.10.2013, 22:21. Показов 1983. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
массив из случайных целых чисел от -1000 до 1000. задача найти непрерывную часть этого массива чтобы сумма элементов была максимальной
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.10.2013, 22:21
Ответы с готовыми решениями:

Найти непрерывную часть массива, чтобы сумма элементов была максимальной
массив из случайных целых чисел от -1000 до 1000. задача найти непрерывную часть этого массива чтобы сумма элементов была максимальной

В двухмерном массиве n × n найти диагональ, параллельную главной диагонали, сумма элементов которой была бы максимальной.
В двухмерном массиве n × n найти диагональ, параллельную главной диагонали, сумма элементов которой была бы максимальной.

Найти сумму наибольших элементов матрицы, чтобы сумма была наибольшей
Дано масив 11 на 11 41 67 34 0 69 24 78 58 62 64 5 45 81 27 61 91 95 42 27 36 91 4 2 53 92 82 21 16 18 95 47 26 71 38 69...

7
82 / 82 / 44
Регистрация: 14.07.2013
Сообщений: 410
01.11.2013, 00:51
Цитата Сообщение от TF Посмотреть сообщение
чтобы сумма элементов была максимальной
и как понять ваше условие? по сравнению с чем сума скольких елементов должна быть максимальной? В каком смысле неприрывную?
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
01.11.2013, 10:55
IchimaruGin, я думаю так:
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
#include <iostream>
using namespace std;
 
int main()
{
const int n = abs(-1000) + 1 + 1000;
int arr[n];
 
for( int i=0; i<n; i++ )
  arr[i] = rand();
 
int currSumm,
    numBegin=arr[0],
    numEnd=arr[0],
    summ=0;
 
for( int begin=0; begin<n; begin++ )
  {
  currSumm = 0;
  for(int end=begin; end<n; end++ )
    {
    currSumm += arr[end];
    if( currSumm > summ )
      {
      summ = currSumm;
      numBegin = begin; // Хрен его знает зачем
      numEnd = end;     //
      }
    }
  }
cout << summ;
cin.ignore();
        return 0;
}
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
01.11.2013, 11:35
Цитата Сообщение от SatanaXIII Посмотреть сообщение
numBegin=arr[0],
* * numEnd=arr[0],
Наверное не arr[0], а просто -1?

Надеюсь, что эту задачу дали как пример того, когда не надо использовать рекурсию. А то у нее будет просто ужасная алгоритмическая сложность - из-за постоянных перевычислений одного и того же.

SatanaXIII тоже предложил не самый лучший алгоритм - у него O(n*n). А задача решается с помощью динамического программирования - один раз проходим циклом по массиву, на каждой позиции находя максимальный подмассив, кончающийся на этой позиции. Тогда сложность - О(n).
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
01.11.2013, 12:03
Цитата Сообщение от ct0r Посмотреть сообщение
Наверное не arr[0], а просто -1?
Почему?

Цитата Сообщение от ct0r Посмотреть сообщение
решается с помощью динамического программирования - один раз проходим циклом по массиву, на каждой позиции находя максимальный подмассив, кончающийся на этой позиции. Тогда сложность - О(n).
Зато проигрыш в памяти.
Потом все равно потребуется еще один проход, но уже по созданному массиву.
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
01.11.2013, 12:51
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Почему?
Ну потому что иначе странно - ты инициализируешь по сути случайными значениями массива, а потом пихаешь туда индексы.

Цитата Сообщение от SatanaXIII Посмотреть сообщение
Зато проигрыш в памяти.
Потом все равно потребуется еще один проход, но уже по созданному массиву.
Там нету проигрыша в памяти, потому что мы ничего не создаем:
http://en.wikipedia.org/wiki/M... ay_problem
Кстати, даже если бы понадобился еще один проход, то это все равно О(n), а не O(n*n).
И даже если бы использовалась дополнительная память, то производительность все равно в 90% случаев важнее.
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
01.11.2013, 13:18
Цитата Сообщение от ct0r Посмотреть сообщение
Ну потому что иначе странно - ты инициализируешь по сути случайными значениями массива, а потом пихаешь туда индексы.
Действительно.
Только не -1, а 0. n то у нас больше чем ноль - защита не нужна.

Цитата Сообщение от ct0r Посмотреть сообщение
Maximum_subarray_problem
Спасибо. Почитал.
0
 Аватар для zitxbit
96 / 748 / 279
Регистрация: 11.04.2012
Сообщений: 971
01.11.2013, 13:40
Вот мой вариант решения задачи. Алгоритм - получение методом перебора всех под-последовательностей элементов с каждой позиции в массиве. Далее вычисление суммы элементов каждой из под-последовательностей, далее нахождение наибольшей суммы.
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
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
 
#define N 10
 
int main(int argc, char* argv[])
{
    int A[N] = { 0 };
    for (int i = 0; i < N; i++)
    {
        A[i] = rand() % 2000 - 1000;
        printf("%d ",A[i]);
    }
 
    printf("\n\n");
 
    int max = 0, pos = 0, len = 0;
    for (int t = 0; t < N; t++)
    {
        int cnt = 0;
        while (cnt < N)
        {
            int k = t, sum = 0;
            while (k <= cnt) sum+=A[k++];
            if (sum > max) { max = sum; pos = t; len = cnt-pos+1; }
 
            cnt++;
        }
    }
 
    printf("sum = %d pos = %d len = %d\n",max,pos,len);
 
    _getch();
}
http://codepad.org/MKOuhrDx
Миниатюры
Рекурсия: найти непрерывную часть массива, чтобы сумма элементов была максимальной  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.11.2013, 13:40
Помогаю со студенческими работами здесь

Представить заданное число в виде произведения двух натуральных чисел, чтобы их сумма была максимальной
Помогите с задачей пожалуйста,очень срочно!!! Задано натуральное число x. Необходимо представить его в виде произведения x = a • b (a и b –...

Отсортировать строки массива так, чтобы первой шла строка, сумма элементов которой была меньше, чем остальных
Добрый день, помогите, пожалуйста найти ошибку. Нужно создать двумерный массив, размером 5 х 7 (пять строк, семь столбцов). Заполнить...

Отсортировать строки массива так, чтобы первой шла строка, сумма элементов которой была меньше, чем остальных
Нужно создать двумерный массив, размером 5 х 7 (пять строк, семь столбцов). Заполнить его случайно целыми числами, в районе от 0 до 30....

Найти число, меньше заданного, в котором сумма цифр была бы максимальной
Привет всем вот как бы вы решили эту задачу ? вот дано 'x' где 1&lt;=x&lt;=10^18 нужно найти такое число меньше 'x' что бы сумма цифр...

Представить число N в виде суммы M натуральных слагаемых так, чтобы сумма синусов слагаемых была максимальной
Даны натуральные числа N и M. Нужно представить число N в виде суммы M натуральных слагаемых так, чтобы сумма синусов этих слагаемых была...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru