最大サブアレイ


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も明確ではありません。それは図書館を意味しますか?カスタムライブラリ?プログラムのアウトソーシング?後者は、標準の抜け穴によってすでに禁止されています。
リーキー修道女

14
stdin以外を読んだり、stdout以外の場所に書き込んだりしないでください。- なぜ?
氏Xcoder

2
非常によく似ており、おそらくはduです。また、非常に似ています。
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

オンラインでお試しください!

-1 Adnanに感謝します。


Okxの答えと同じヒント:ÎŒOM4バイトで動作するはずです。
アドナン

@Adnanありがとう組み込みの "1 and input"しかないと思った...待って...そうですか それらは連結されるべきではありませんか?
エリックアウトゴルファー

いいえ、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;}

最初のforループの後に中括弧を削除できますか?
ザカリー

また、なぜあなたは持っていないlhとにかく?
ザカリー

@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
  • 空でない可能性のあるすべてのサブセットに対して2回繰り返します。
  • サブセットの合計を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=0を使用して2バイトを保存できます。maxbnumeric
ジュゼッペ





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とてもいいですね。これを別の方法としてこの回答に追加します。おそらくHuskの回答のように、reduce / concatを組み合わせることで改善できるでしょうか?
ジャスティンマリナー


1

JavaScript、58バイト

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

KadaneのアルゴリズムのGolfed JS実装。できるだけ短くします。建設的な提案を歓迎します!

この投稿から学んだこと:戻り値eval-その最後の文がforループである場合-は、基本的にループに存在する最後の値です。クール!

編集:ジャスティンとヘルマンの提案のおかげで4バイトを節約しました。


あなたは避けることができますreturn置き換えることによって{...;return b;}eval("...;b")evalは最後の文を返すからです。
ジャスティンマリナー

@JustinMarinerありがとう!ここで常に何か新しいことを学んでいます:)
ガランタンドン

あなたは除去することにより、さらに2つのバイトを削除することができ;b、それがforループから返されることから、
ハーマンLを

@HermanLauensteinああ、すごい、ありがとう、それは便利です!
ゴーランタンドン




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

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ソリューションと同様:すべてのサフィックスのスキャン合計(マトリックスを生成)、レイズ、最大値を取る

オンラインでお試しください!

注意

バイトが多すぎないため、効率的な解決策を得ることができます(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);}

ここで試してみてください。

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.