По заданной последовательности целых чисел найдите наибольшую сумму подпоследовательности (целые числа в последовательных позициях) последовательности. Подпоследовательность может быть пустой (в этом случае сумма равна 0).
Ввод читается из стандартного ввода, одно целое число в строке. Наибольшая сумма должна быть записана в стандартный вывод.
Я написал небольшой генератор для вас:
#include <stdio.h>
#include <assert.h>
/* From http://en.wikipedia.org/wiki/Random_number_generation */
unsigned m_w;
unsigned m_z;
unsigned get_random()
{
m_z = 36969 * (m_z & 65535) + (m_z >> 16);
m_w = 18000 * (m_w & 65535) + (m_w >> 16);
return (m_z << 16) + m_w; /* 32-bit result */
}
int main(int argc, char **argv)
{
int i;
assert(argc == 3);
m_w = atoi(argv[1]);
m_z = atoi(argv[2]);
i = 10;
while (i--);
get_random();
i = atoi(argv[2]);
while (i--)
printf("%d\n", (int) get_random() << 8 >> 22);
return 0;
}
Примеры:
$ printf "1\n2\n-1\n4\n" | ./sum
6
$ printf "0\n-2\n-3\n" | ./sum
0
$ ./a.out 1 1 | ./sum
387
$ ./a.out 1 10 | ./sum
571
$ ./a.out 1 100 | ./sum
5867
$ ./a.out 1 1000 | ./sum
7531
$ ./a.out 1 10000 | ./sum
27268
$ ./a.out 1 100000 | ./sum
101332
$ ./a.out 1 1000000 | ./sum
187480
$ ./a.out 1 10000000 | ./sum
666307
./sum
мое решение./a.out
это генератор
Ваше решение должно быть запущено в разумные сроки для всех тестов, описанных выше (мой тест выполняется за 1.2 с в последнем тестовом примере).
Самый короткий код выигрывает.
Изменить : Пожалуйста, приведите пример выполнения одного из тестов выше.
code-golf
subsequence
Александр
источник
источник
#include <stdlib.h>
дляatoi()
.while (i--);
не должна заканчиваться точкой с запятой, не так ли?Ответы:
Рубин, 53 персонажа
Занимает около 28 секунд для последнего теста здесь.
источник
Python,
918464 знакаЗанимает около
141272 секунд в последнем тестовом случае. Изменить: с помощью алгоритма Пол Р. нашел. Редактировать: отменить импорт, используяinput()
.источник
C, 100 символов
Время выполнения = 1,14 с для окончательного тестового примера (10000000) на 2,67 ГГц Core i7 с ICC 11.1 (ранее: 1,44 с с gcc 4.2.1).
Примечание. Алгоритм, использованный для вышеуказанного решения, взят из книги «Программирование жемчуга » Джона Бентли. По-видимому, этот алгоритм известен как алгоритм Кадане .
источник
Хаскелл (
8864)Реализация алгоритма Кадане.
источник
Питон - 114 символов
Это, конечно, не так быстро, как требуется, но работает нормально.
источник
Python, использующий динамическое программирование - 92 символа
источник
J (
3433 символа)Это решение реализует вариант алгоритма Кадане и является достаточно быстрым.
Вот объяснение:
u/ y
- Глаголu
вставлен между элементамиy
. Например,+/ 1 2 3 4
это как1 + 2 + 3 + 4
. Обратите внимание, что все глаголы в J ассоциированы справа, то-/ 1 2 3 4
есть подобны1 - (2 - (3 - 4))
и вычисляют переменную сумму1 2 3 4
.x >. y
- максимумx
аy
.x ([ >. +) y
- Максимумx
аx + y
.[ >. +
является глаголом в молчаливом обозначении и оценивается так же, какx >. x + y
.([ >. +)/ y
- непустой префиксy
с наибольшей суммой.u\. y
-u
применяется ко всем суффиксамy
. Обратите внимание, что специальный код обрабатывает общий случай такu/\. y
, что он выполняется в линейном, а не в квадратичном времени.([ >. +)/\. y
- Вектор, обозначающий самый большой непустой подмассив, который начинается в каждой позицииy
.0 , ([ >. +)/\. y
- подготовлен0
к предыдущему результату как0
длина пустого подмассиваy
.>./ 0 , ([ >. +)/\. y
- самый большой подмассивy
.0 ". ];._2 (1!:1) 3
- Стандартный ввод маршалируется в вектор чисел.>./ 0 , ([ >. +)/\. 0 ". ];._2 (1!:1) 3
- Самый большой подмассив в стандартном вводе.источник
Рубин, 68 символов
Также немного медленный, но завершает тесты 1-10000000 за полминуты, большую часть времени проведенную в последнем тесте ...
Версия с отступом:
источник
C ++, 192 символа
Работает достаточно быстро на моем ноутбуке (4 секунды для последнего теста).
источник
cstdlib
неstdlib.h
Код awk (66) , очень медленный, 8+ секунд для последнего теста
источник