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

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

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

Author24 — интернет-сервис помощи студентам
массив из случайных целых чисел от -1000 до 1000. задача найти непрерывную часть этого массива чтобы сумма элементов была максимальной
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
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...

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

7
82 / 82 / 44
Регистрация: 14.07.2013
Сообщений: 410
01.11.2013, 00:51 2
Цитата Сообщение от TF Посмотреть сообщение
чтобы сумма элементов была максимальной
и как понять ваше условие? по сравнению с чем сума скольких елементов должна быть максимальной? В каком смысле неприрывную?
0
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
01.11.2013, 10:55 3
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
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
01.11.2013, 11:35 4
Цитата Сообщение от SatanaXIII Посмотреть сообщение
numBegin=arr[0],
* * numEnd=arr[0],
Наверное не arr[0], а просто -1?

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

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

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

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

Цитата Сообщение от ct0r Посмотреть сообщение
Maximum_subarray_problem
Спасибо. Почитал.
0
96 / 748 / 279
Регистрация: 11.04.2012
Сообщений: 971
01.11.2013, 13:40 8
Вот мой вариант решения задачи. Алгоритм - получение методом перебора всех под-последовательностей элементов с каждой позиции в массиве. Далее вычисление суммы элементов каждой из под-последовательностей, далее нахождение наибольшей суммы.
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
01.11.2013, 13:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.11.2013, 13:40
Помогаю со студенческими работами здесь

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

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

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

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


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

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