Максимальный подмассив

21

Определите «максимальный подмассив» данного массива как «(последовательный) подмассив с наибольшей суммой». Обратите внимание, что нет «ненулевого» требования. Выведите эту сумму.

Дайте описание вашего кода, если это возможно.

Пример ввода 1:

1 2 3 -4 -5 6 7 -8 9 10 -11 -12 -13 14

Пример вывода 1: 24

Описание 1:
Самая большая сумма получается путем вычитания 6 7 -8 9 10и суммирования.

Пример ввода 2: -1 -2 -3
Пример вывода 2: 0
Описание 2: Это просто :) Пустой подмассив является «самым большим».

Требование:

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

Рейтинг: самая короткая программа выигрывает этот .

iBug
источник
5
Напишите программу, максимально короткую. Я бы порекомендовал убрать это требование, так как оно требует от нас проверять каждую возможную программу на нашем языке и убедиться, что мы используем самую короткую версию.
Okx
Требование 2 также неясно. Это значит библиотеки? Пользовательские библиотеки? Аутсорсинг программы? Последнее уже запрещено стандартными лазейками.
Утренняя монахиня
14
Не читайте ничего кроме стандартного ввода и не пишите нигде, кроме стандартного ввода. - Зачем?
г-н Xcoder
2
Очень похоже , возможно, обманщик. Тоже очень похоже .
xnor

Ответы:

4

Pyth , 8 байт

eS+0sM.:

Попробуйте онлайн!


Как?

eS + 0sM.: Q - Q неявно, что означает ввод. Допустим, это [-1, -2, -3].

      .: - Все смежные непустые подсписки. У нас есть [[-1], [-2], [-3], [-1, -2], [-2, -3], [-1, -2, -3]].
    СМ - получить сумму каждого подсписка. [-1, -2, -3, -3, -5, -6]
  +0 - Добавить 0 к списку сумм. [0, -1, -2, -3, -3, -5, -6]
eS - Максимальный элемент. S дает нам [-6, -5, -3, -3, -2, -1, 0], а e возвращает 0, последний элемент.
Мистер Xcoder
источник
4

05AB1E , 4 байта

Ό0M

Попробуйте онлайн!

-1 спасибо Аднану .

Эрик Outgolfer
источник
Тот же совет, что и с ответом Оккса: ÎŒOMдолжен работать на 4 байта.
Аднан
@ Adnan Спасибо, я думал, что была только встроенная "1 и ввод" ... подождите ... не так ли? Разве они не должны быть соединены или что-то?
Эрик Outgolfer
Нет, Mищет наибольшее число в плоской версии стека.
Аднан
@ Аднан, ладно ... это для меня новость, лол
Эрик Аутгольфер,
3

C ++, 197 195 187 байт

-10 байт благодаря Захари

#include<vector>
#include<numeric>
int f(std::vector<int>v){int i=0,j,t,r=0;for(;i<v.size();++i)for(j=i;j<v.size();++j){t=std::accumulate(v.begin()+i,v.begin()+j,0);if(t>r)r=t;}return r;}
HatsuPointerKun
источник
Можете ли вы удалить скобки после первого цикла for?
Захари
Кроме того, почему у вас есть lи в hлюбом случае?
Захари
@ Zacharý l и h были для начального и конечного индекса
подмассива
3

R , 54 байта

a=b=0;for(x in scan()){a=max(x,a+x);b=max(a,b)};cat(b)

Попробуйте онлайн!

Алгоритм взят из: Максимальная проблема подмассива

R 65 байт

y=seq(x<-scan());m=0;for(i in y)for(j in y)m=max(m,sum(x[i:j]));m

Попробуйте онлайн!

  • Читайте xиз стандартного ввода.
  • Установить в yкачестве индекса x.
  • Итерация дважды по всем возможным непустым подмножествам.
  • Сравните сумму подмножества с m(изначально m=0).
  • Сохранить максимальное значение в m.
  • Значение печати m.

R , 72 байта

n=length(x<-scan());m=0;for(i in 1:n)for(j in i:n)m=max(m,sum(x[i:j]));m

Попробуйте онлайн!

  • Читайте xиз стандартного ввода.
  • Сделайте полный поиск по всем возможным непустым подмножествам.
  • Сравните сумму подмножества с m(изначально m=0).
  • Сохранить максимальное значение в m.
  • Значение печати m.

Другие неудачные идеи

58 байт

Reduce(max,lapply(lapply(seq(x<-scan()),tail,x=x),cumsum))

63 байта

Reduce(max,lapply(seq(x<-scan()),function(i)cumsum(tail(x,i))))

72 байта

m=matrix(x<-scan(),n<-length(x),n);max(apply(m*lower.tri(m,T),2,cumsum))
djhurio
источник
1
a=b=0тоже работает Кроме того, вам нужно обрабатывать печать на выходе. При запуске в качестве полной программы (через source) это ничего не печатает.
JAD
@JarkoDubbeldam, я добавил cat(b), но если с источником echo=TRUEэтого достаточно, чтобы вызвать bраспечатку.
Джурио
Я предполагаю, что нет четкого определения того, как полнофункциональные программы запускаются в R. В командной строке есть rscript, а в самом R - источник. Но обычно флаги, необходимые для запуска скрипта, включены в bytecount. (Лично мне не удалось заставить rscript хорошо работать со сканером, но это другое дело.
JAD
Вы можете использовать T=Fвместо того, a=b=0чтобы сохранить два байта, потому что maxприведет bк numeric.
Джузеппе
3

Haskell , 28 байт

maximum.scanl((max<*>).(+))0

Попробуйте онлайн!

H.PWiz
источник
не будет ли максимум всегда последним элементом в возвращаемом из scanl? так foldl((max<*>).(+))0??
Матиас
NVM я вижу свою ошибку!
Матиас
@matthias Если вы увидите историю редактирования, вы увидите, что я допустил ошибку sma. :-)
H.PWiz
2

Mathematica, 24 байта

Max[Tr/@Subsequences@#]&
J42161217
источник
2

Haskell , 41 33 байта

import Data.List
g=maximum.concatMap(map sum.inits).tails
maximum.(scanl(+)0=<<).scanr(:)[]

Попробуйте онлайн! благодаря Лайкони

michi7x7
источник
1
Анонимные функции разрешены в качестве представления, так что вы можете удалить g=. Вместо этого concatMapвы можете использовать =<<из списка монаду: попробуйте онлайн! (33 байта).
Лайкони
1

Japt , 11 байт

£ãY mxÃc rw

Попробуйте онлайн!

объяснение

£ãY mxÃc rw
m@ãY mx} c rw   // Ungolfed
m@     }        // Map the input array by the following function, with Y=index
  ãY            //   Get all subsections in input array length Y
     mx         //   Sum each subsection
         c rw   // Flatten and get max

Альтернативный метод, 11 байт

Из @ETHproductions; основанный на ответе Хаска Грубых Сил .

£sY å+Ãc rw

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

Попробуйте онлайн!

Джастин Маринер
источник
Хорошо, действительно хорошо. Я не пытался реализовать эту задачу, когда видел ее раньше, но я думал о другой технике и ожидал, что она будет иметь размер около 15 байт, так что это здорово.
ETHproductions
Глядя на ответ Husk, есть еще один эффективный способ: £sY å+Ãc rw(также 11 байт)
ETHproductions
@ETHproductions Довольно мило, я добавлю это к этому ответу в качестве альтернативного метода. Может быть, это может быть улучшено с помощью некоторой комбинации Reduce / Concat, также как этот ответ Husk?
Джастин Маринер
1

JavaScript, 58 байт

m=Math.max;x=y=>eval("a=b=0;for(k of y)b=m(a=m(a+k,k),b)")

Гольф JS реализация алгоритма Кадане. Сделано как можно короче. Открыты для конструктивных предложений!

Из того, что я узнал из этого поста: возвращаемое значение eval- когда его последний статус представляет собой forцикл - в основном является последним значением, присутствующим внутри цикла. Круто!

РЕДАКТИРОВАТЬ: сэкономил четыре байта благодаря предложениям Джастина и Германа.

Гауранг Тандон
источник
Вы можете избежать return, заменив {...;return b;}на, eval("...;b")так как eval возвращает последний оператор.
Джастин Маринер
@JustinMariner спасибо! Я всегда
узнаю
Вы можете удалить еще два байта, удалив их ;b, поскольку они возвращаются из цикла for
Herman L
@HermanLauenstein О, вау, спасибо, это полезно!
Гауранг Тандон
0

Python 2 , 52 51 байт

f=lambda l:len(l)and max(sum(l),f(l[1:]),f(l[:-1]))

Попробуйте онлайн!

Сизиф
источник
1
Это кажется противоречивым (в противном случае ненужным) требованием. Не читайте ничего, кроме stdin, и не пишите нигде, кроме stdout.
г-н Xcoder
0

k , 14 байтов

|/,/+\'(1_)\0,

Попробуйте онлайн!

            0, /prepend a zero (in case we're given all negatives)
       (1_)\   /repeatedly remove the first element, saving each result
    +\'        /cumulative sum over each result, saving each result
  ,/           /flatten (fold concat)
|/             /maximum (fold max)
zgrep
источник
0

APL, 31 29 27 байт

⌈/∊∘.{+/W[X/⍨⍺≤X←⍳⍵]}⍨⍳⍴W←⎕

Попробуйте онлайн! (изменено так, что оно будет работать на TryAPL)

Как?

  • ∊∘.{+/W[X/⍨⍺≤X←⍳⍵]}⍨⍳⍴W←⎕ Генерация сумм субвекторов
  • ⌈/ максимальная
Zachary
источник
0

CJam, 24 байта

q~:A,{)Aew{:+}%}%e_0+:e>

Функция, которая принимает массив чисел в качестве входных данных.

Попробуйте онлайн

q~:A   e# Store array in 'A' variable
,{)Aew e# Get every possible sub-array of the array
{:+}%  e# Sum every sub array
}e_    e# flatten array of sums
0+     e# Add zero to the array
:e>    e# Return max value in array
geokavel
источник
0

МОЙ , 11 байт

⎕𝟚35ǵ'ƒ⇹(⍐↵

Попробуйте онлайн! МОЙ сейчас на ТИО! Woohoo!

Как?

  • = оцененный вклад
  • 𝟚 = подвекторы
  • 35ǵ'= chr(0x53)(Σ, сумма)
  • ƒ = строка как функция MY
  • = карта
  • ( = применить
  • = максимум
  • = вывод с новой строкой.

Сумма была исправлена ​​( 0на пустых массивах), чтобы это работало. Продукт был также исправлен.

Zachary
источник
0

J, 12 байт

[:>./@,+/\\.

Аналогично K-решению zgrep: проверка суммы всех суффиксов (создание матрицы), raze, take max

Попробуйте онлайн!

НОТА

для не слишком большого количества байтов вы можете получить эффективное решение (19 байтов в гольфе):

[: >./ [: ({: - <./)\ +/\
Ион
источник
0

Аксиома, 127 байт

f(a:List INT):Complex INT==(n:=#a;n=0=>%i;r:=a.1;for i in 1..n repeat for j in i..n repeat(b:=reduce(+,a(i..j));b>r=>(r:=b));r)

Это будет O (# a ^ 3) Algo; Я копирую это из C ++ один ... результаты

(3) -> f([1,2,3,-4,-5,6,7,-8,9,10,-11,-12,-13,14])
   (3)  24
                                                    Type: Complex Integer
(4) -> f([])
   (4)  %i
                                                    Type: Complex Integer
(5) -> f([-1,-2,3])
   (5)  3
                                                    Type: Complex Integer
RosLuP
источник
0

Scala, 105 байт

val l=readLine.split(" ").map(_.toInt);print({for{b<-l.indices;a<-0 to b+2}yield l.slice(a,b+1).sum}.max)

Я не нашел лучший способ генерировать суб списки массивов.

6infinity8
источник
0

Java 8, 242 байта

import java.util.*;v->{List a=new Stack();for(String x:new Scanner(System.in).nextLine().split(" "))a.add(new Long(x));int r=0,l=a.size(),i=l,j,k,s;for(;i-->0;)for(j=l;--j>1;r=s>r?s:r)for(s=0,k=i;k<j;)s+=(long)a.get(k++);System.out.print(r);}

Попробуй это здесь.

106 байт без использования требования STDIN / STDOUT ..>.>

a->{int r=0,l=a.length,i=l,j,k,s;for(;i-->0;)for(j=l;--j>1;r=s>r?s:r)for(s=0,k=i;k<j;s+=a[k++]);return r;}

Попробуй это здесь.

Объяснение:

import java.util.*;      // Required import for List, Stack and Scanner

v->{                     // Method with empty unused parameter and no return-type
  List a=new Stack();    //  Create a List
  for(String x:new Scanner(System.in).nextLine().split(" "))
                         //  Loop (1) over the STDIN split by spaces as Strings
    a.add(new Long(x));  //   Add the String converted to a number to the List
                         //  End of loop (1) (implicit / single-line body)
  int r=0,               //  Result-integer
      l=a.size(),        //  Size of the List
      i=l,j,k,           //  Index-integers
      s;                 //  Temp sum-integer
  for(;i-->0;)           //  Loop (2) from `l` down to 0 (inclusive)
    for(j=l;--j>1;       //   Inner loop (3) from `l-1` down to 1 (inclusive)
        r=               //     After every iteration: change `r` to:
          s>r?           //      If the temp-sum is larger than the current `r`:
           s             //       Set `r` to the temp-sum
          :              //      Else:
           r)            //       Leave `r` the same
      for(s=0,           //    Reset the temp-sum to 0
          k=i;k<j;)      //    Inner loop (4) from `i` to `j` (exclusive)
        s+=(long)a.get(k++);
                         //     Add the number at index `k` in the List to this temp-sum
                         //    End of inner loop (4) (implicit / single-line body)
                         //   End of inner loop (3) (implicit / single-line body)
                         //  End of loop (2) (implicit / single-line body)
  System.out.print(r);   //  Print the result to STDOUT
}                        // End of method
Кевин Круйссен
источник