최대 하위 배열


21

주어진 배열의 "최대 하위 배열"을 "가장 큰 합계를 갖는 (연속적인) 하위 배열"로 정의하십시오. "0이 아닌"요구 사항은 없습니다. 그 합계를 출력합니다.

가능하면 코드에 대한 설명을 제공하십시오.

샘플 입력 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 이외의 곳에서는 쓰지 마십시오. - 왜?
Mr. 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]이 있습니다.
    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

온라인으로 사용해보십시오!

Adnan 에게 -1 감사합니다 .


Okx의 답변과 같은 팁 : ÎŒOM4 바이트 동안 작동해야합니다.
Adnan

@Adnan 고맙습니다. "1과 입력"만 내장되어 있다고 생각했습니다 ... 기다리십시오 ... 그렇습니까? 연결되어 있지 않아야합니까?
아웃 골퍼 에릭

아니요, M병합 된 버전의 스택에서 가장 큰 숫자를 검색합니다.
Adnan

@Adnan ok ... 이것은 나에게 뉴스입니다 lol
Erik the Outgolfer


3

C ++, 197 195 187 바이트

Zacharý 덕분에 -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;}

첫 번째 for 루프 후에 버팀대를 제거 할 수 있습니까?
Zacharý

또한, 당신은 왜해야합니까 lh어쨌든?
Zacharý

@ Zacharý l과 h는 서브 어레이의 시작과 끝 인덱스를위한 것입니다
HatsuPointerKun

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

온라인으로 사용해보십시오!

  • xstdin에서 읽습니다 .
  • 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

온라인으로 사용해보십시오!

  • xstdin에서 읽습니다 .
  • 비어 있지 않은 모든 가능한 하위 집합에 대해 전체 검색을 수행하십시오.
  • 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인쇄물 을 호출 하기에 충분합니다 .
djhurio

R에서 전체 프로그램이 어떻게 실행되는지에 대한 명확한 정의가 없다고 생각합니다. 커맨드 라인에는 rscript가 있고 R 자체에는 소스가 있습니다. 그러나 일반적으로 스크립트를 실행할 때 필요한 플래그는 바이트 수에 포함됩니다. (저는 개인적으로 스캔을 잘 수행 할 수있는 rscript를 얻지 못했지만 다른 것입니다.
JAD

에 강제 하기 때문에 T=F대신 a=b=02 바이트를 저장 하는 대신 사용할 수 있습니다 . maxbnumeric
Giuseppe





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에서; Brute Forces의 Husk answer 에 기반합니다 .

£sY å+Ãc rw

입력 배열의 모든 꼬리를 가져오고 각각을 합산합니다. 그런 다음 배열을 평평하게하고 최대 값을 얻습니다.

온라인으로 사용해보십시오!


정말 좋아요 나는이 도전을 이전에 보았을 때 구현하려고 시도하지 않았지만 다른 기술을 생각하고 약 15 바이트가 나올 것으로 예상했기 때문에 이것은 훌륭합니다.
ETHproductions

Husk 답변을 살펴보면 또 다른 효율적인 방법이 있습니다. £sY å+Ãc rw(또한 11 바이트)
ETHproductions

@ETHproductions이 답변에 다른 방법으로 추가하겠습니다. Husk 답변과 같이 축소 / 연결의 조합으로 개선 될 수 있습니까?
저스틴 마리너

1

루비, 61 59 57 바이트

방금 Ruby를 배우기 시작했습니다. 이것이 제가 생각해 낸 것입니다.

s=0
p [gets.split.map{|i|s=[j=i.to_i,s+j].max}.max,0].max

나는 이 미완성 된 책 의 핀란드어 버전에서이 알고리즘을 처음 보았다 . 23 페이지에 잘 설명되어 있습니다.

온라인으로 사용해보십시오!


1

자바 스크립트, 58 바이트

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

Kadane 알고리즘의 골프 JS 구현. 가능한 짧게 만들었습니다. 건설적인 제안에 개방!

이 게시물에서 배운 것 : 반환 값 eval-마지막 통계가 for루프 일 때-기본적으로 루프 안에 있는 마지막 값 입니다. 시원한!

편집 : Justin과 Hermann의 제안 덕분에 4 바이트를 절약했습니다.


eval이 마지막 명령문을 리턴하므로 with return로 바꾸면 피할 수 있습니다 . {...;return b;}eval("...;b")
저스틴 마리너

@JustinMariner 감사합니다! 항상 새로운 여기에 :) 뭔가를 배우고
Gaurang Tandon에게

당신은 제거하여 두 바이트 이상을 제거 할 수 ;b가 for 루프에서 반환 이후
허먼 L을

@HermanLauenstein 오,와, 고마워, 그것은 유용하다!
Gaurang Tandon




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)

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

MY , 11 바이트

⎕𝟚35ǵ'ƒ⇹(⍐↵

온라인으로 사용해보십시오! 내 지금 TIO에 있습니다! 우후!

방법?

  • = 평가 입력
  • 𝟚 = 서브 벡터
  • 35ǵ'= chr(0x53)(Σ, 합계)
  • ƒ = MY 함수로서의 문자열
  • =지도
  • ( = 적용
  • = 최대
  • = 줄 바꿈으로 출력합니다.

0이것이 작동하기 위해 합계가 ( 빈 배열에서) 고정되었습니다 . 제품도 수정되었습니다.


0

J, 12 바이트

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

zgrep의 K 솔루션과 유사 : 모든 접미사의 스캔 합계 (매트릭스 생성), raze, 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

스칼라, 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

자바 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);}

여기에서 시도하십시오.

STDIN / STDOUT 요구 사항을 사용하지 않고 106 바이트 ..>.>

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.