Максимальний масив


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: Це просто :) Порожній підрядок - "найбільший".

Вимога:

  • Не читайте нічого, крім stdin, і вихід повинен переходити до stdout.
  • Застосовуються стандартні обмеження лазівки .

Рейтинг: Найкоротша програма виграє цей .


5
Напишіть програму, яка є якомога коротшою. Я рекомендую зняти цю вимогу, оскільки вона вимагає від нас перевірити всі можливі програми нашою мовою та переконатися, що ми використовуємо найкоротше.
Okx

Вимога 2 також незрозуміла. Це означає бібліотеки? Спеціальні бібліотеки? Аутсорсинг програми? Останнє вже заборонено стандартними лазівками.
Leaky Nun

14
Не читайте нічого, крім stdin, і не пишіть нікуди, крім stdout. - Чому?
Містер Xcoder

Відповіді:




4

Pyth , 8 байт

eS+0sM.:

Спробуйте в Інтернеті!


Як?

eS + 0sM .: Q - Q неявний, що означає введення. Скажімо, це [-1, -2, -3].

      .: - Усі суміжні не порожні списки. Маємо [[-1], [-2], [-3], [-1, -2], [-2, -3], [-1, -2, -3]].
    sM - Отримайте суму кожного списку. [-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, останній елемент.

4

05AB1E , 4 байти

Ό0M

Спробуйте в Інтернеті!

-1 завдяки Аднану .


Та сама порада, що і у відповіді Okx: ÎŒOMмає працювати на 4 байти.
Аднан

@Adnan Спасибі Я думав, що існує тільки "1 і вхід" вбудований ... зачекайте ... чи це? Вони не повинні бути об'єднані чи щось таке?
Erik the Outgolfer

Ні, Mшукає найбільшу кількість у сплющеній версії стека.
Аднан

@Adnan гаразд ... це новина для мене
хаха


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;}

Чи можете ви зняти брекети після першого циклу?
Zacharý

Крім того, чому у вас є lі як і раніше h?
Zacharý

@ 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з stdin.
  • Встановити 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з stdin.
  • Здійсніть повний пошук у всіх можливих непорожніх підмножинах.
  • Порівняйте суму підмножини з 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))

1
a=b=0працює теж. Також потрібно обробляти друк виводу. Якщо запускати як повну програму (через source), це нічого не друкує.
JAD

@JarkoDubbeldam, я додав cat(b), але якщо echo=TRUEце знайдеться, достатньо викликати bроздруківку.
джуріо

Я думаю, не існує чіткого визначення того, як повноцінні програми запускаються в R. Є rscript в командному рядку, а джерело в самому R. Але зазвичай прапори, необхідні під час запуску сценарію, включаються до облікового запису. (Мені особисто не вдалося змусити rscript добре працювати зі скануванням, але це інша річ.
JAD

Ви можете використовувати T=Fзамість того, a=b=0щоб зберегти два байти, тому що maxбуде примусово bдоnumeric .
Джузеппе

3

Haskell , 28 байт

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

Спробуйте в Інтернеті!


чи не завжди максимум буде останнім елементом у поверненому scanl? так foldl((max<*>).(+))0??
Маттіас

НВМ, я бачу свою помилку!
Маттіас

@matthias Якщо ви бачите історію редагування, ви побачите, що я зробив помилку smma. :-)
H.PWiz



2

Haskell , 41 33 байт

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

Спробуйте в Інтернеті! завдяки Лайконі


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

Дивлячись на відповідь Хука, є ще один ефективний спосіб: £sY å+Ãc rw(також 11 байт)
ETHproductions

@ETHproductions Дуже приємно, я додам, що до цієї відповіді як альтернативний метод. Невже це може бути вдосконалено за допомогою комбінації скорочення / скорочення, як і відповідь Хуска?
Джастін Марінер


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циклом - є в основному останнє значення, присутнє всередині циклу. Класно!

EDIT: збережено чотири байти завдяки пропозиціям Джастіна та Германа.


Ви можете уникнути return, замінивши {...;return b;}на, eval("...;b")оскільки eval повертає останнє твердження.
Джастін Марінер

@JustinMariner дякую! я завжди дізнаюся щось нове тут :)
Gaurang Tandon

Ви можете видалити ще два байти, видаливши його ;b, оскільки він повернувся з циклу for
Herman L

@HermanLauenstein О, вау, спасибі, це корисно!
Gaurang Tandon





0

APL, 31 29 27 байт

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

Спробуйте в Інтернеті! (модифіковано, щоб він запускався на TryAPL)

Як?

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

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

0

МОЙ , 11 байт

⎕𝟚35ǵ'ƒ⇹(⍐↵

Спробуйте в Інтернеті! МОЙ зараз на TIO! Woohoo!

Як?

  • = оцінений вхід
  • 𝟚 = субвектори
  • 35ǵ'= chr(0x53)(Σ, сума)
  • ƒ = рядок як функція МОЙ
  • = карта
  • ( = застосувати
  • = максимум
  • = вихід з нового рядка.

Сума була визначена ( 0на порожніх масивах) для того, щоб це працювало. Товар також був виправлений.


0

J, 12 байт

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

Подібно до рішення K zgrep K: сума сканування всіх суфіксів (створює матрицю), 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

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)

Я не знайшов найкращий спосіб генерувати суб списки масивів.


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.