Sub-array maksimum


21

Tentukan "maksimum sub-array" dari array yang diberikan sebagai "sub-array (berturut-turut) yang memiliki jumlah terbesar". Perhatikan tidak ada persyaratan "tidak nol". Keluarkan jumlah itu.

Berikan deskripsi kode Anda jika memungkinkan.

Masukan sampel 1:

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

Output sampel 1: 24

Deskripsi 1:
Jumlah terbesar dihasilkan dengan memotong 6 7 -8 9 10dan menyimpulkan.

Input sampel 2: -1 -2 -3
Contoh output 2: 0
Deskripsi 2: Sederhana :) Subarray kosong adalah "terbesar".

Kebutuhan:

  • Jangan membaca apa pun kecuali stdin, dan output harus pergi ke stdout.
  • Batasan celah standar berlaku.

Pemeringkatan: Program terpendek memenangkan ini .


5
Tulis program yang sesingkat mungkin. Saya akan merekomendasikan menghapus persyaratan ini karena mengharuskan kami untuk memeriksa setiap program yang mungkin dalam bahasa kami dan memastikan bahwa kami menggunakan yang terpendek.
Okx

Persyaratan 2 juga tidak jelas. Apakah ini berarti perpustakaan? Perpustakaan khusus? Mengalihdayakan program? Yang terakhir sudah dilarang oleh celah standar.
Leaky Nun

14
Jangan membaca apa pun kecuali stdin, dan jangan menulis ke mana pun kecuali stdout. - Kenapa?
Tn. Xcoder

2
Sangat mirip , mungkin menipu. Juga sangat mirip .
xnor

Jawaban:


10

Sekam , 6 4 byte

▲ṁ∫ṫ

Cobalah online!

      -- implicit input (list) xs  - eg. [-1,2,3]
   ṫ  -- get all tails of xs       -     [[-1,2,3],[2,3],[3],[]]
 ṁ∫   -- map & concat cumsum       -     [0,-1,1,4,0,2,5,0,3,0]
▲     -- get maximum               -     5


4

Pyth , 8 byte

eS+0sM.:

Cobalah online!


Bagaimana?

eS + 0sM.: Q - Q implisit, artinya input. Katakanlah [-1, -2, -3].

      .: - Semua sub-daftar yang tidak kosong yang bersebelahan. Kami memiliki [[-1], [-2], [-3], [-1, -2], [-2, -3], [-1, -2, -3]].
    sM - Dapatkan jumlah masing-masing sublist. [-1, -2, -3, -3, -5, -6]
  +0 - Tambahkan 0 ke daftar jumlah. [0, -1, -2, -3, -3, -5, -6]
eS - Elemen maksimum. S memberi kita [-6, -5, -3, -3, -2, -1, 0], sementara e mengembalikan 0, elemen terakhir.



3

C ++, 197 195 187 bytes

-10 byte terima kasih kepada Zacharý

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

Bisakah Anda menghapus kawat gigi setelah yang pertama untuk loop?
Zacharý

Juga, mengapa Anda memiliki ldan hlagian?
Zacharý

@ Zacharý l dan h adalah untuk indeks awal dan akhir dari sub array
HatsuPointerKun

3

R , 54 byte

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

Cobalah online!

Algoritma yang diambil dari: Masalah subarray maksimum

R , 65 byte

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

Cobalah online!

  • Baca xdari stdin.
  • Tetapkan ysebagai indeks x.
  • Ulangi dua kali dari semua himpunan bagian yang tidak kosong yang mungkin.
  • Bandingkan jumlah subset dengan m(awalnya m=0).
  • Simpan nilai maksimum dalam m.
  • Nilai cetak m.

R , 72 byte

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

Cobalah online!

  • Baca xdari stdin.
  • Lakukan pencarian penuh atas semua himpunan bagian nonempty yang mungkin.
  • Bandingkan jumlah subset dengan m(awalnyam=0).
  • Simpan nilai maksimum dalam m.
  • Nilai cetak m.

Gagasan gagal lainnya

58 byte

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

63 byte

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

72 byte

m=matrix(x<-scan(),n<-length(x),n);max(apply(m*lower.tri(m,T),2,cumsum))

1
a=b=0bekerja juga. Juga, Anda perlu menangani pencetakan output. Ketika dijalankan sebagai program lengkap (melalui source) ini tidak mencetak apa pun.
JAD

@JarkoDubbeldam, saya telah menambahkan cat(b), tetapi jika bersumber dari echo=TRUEitu sudah cukup untuk meminta bhasil cetak.
djhurio

Saya kira tidak ada definisi yang jelas tentang bagaimana program penuh dijalankan di R. Ada rscript di commandline, dan sumber di R itu sendiri. Tetapi biasanya flag yang dibutuhkan saat menjalankan skrip dimasukkan dalam bytecount. (Saya pribadi belum berhasil membuat rscript bekerja dengan baik dengan pemindaian, tapi itu hal lain.
JAD

Anda dapat menggunakan T=Fbukan a=b=0untuk menyelamatkan dua byte, karena maxakan memaksa buntuk numeric.
Giuseppe

3

Haskell , 28 byte

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

Cobalah online!


bukankah maksimum selalu menjadi elemen terakhir yang dikembalikan scanl? jadi foldl((max<*>).(+))0??
matthias

NVM saya melihat kesalahan saya!
matthias

@matthias Jika Anda melihat histori edit, Anda akan melihat bahwa saya membuat kesalahan kecil. :-)
H.PWiz



2

Haskell , 41 33 byte

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

Cobalah online! terima kasih untuk Laikoni


1
Fungsi anonim diizinkan sebagai kiriman, sehingga Anda dapat membatalkan g=. Alih-alih concatMapAnda dapat menggunakan =<<dari daftar monad: Coba online! (33 byte).
Laikoni

1

Japt , 11 byte

£ãY mxÃc rw

Cobalah online!

Penjelasan

£ã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

Metode alternatif, 11 byte

Dari @ETHproductions; berdasarkan jawaban Sekam Brute Forces .

£sY å+Ãc rw

Mendapat semua ekor dari array input dan secara total menjumlahkan masing-masing. Kemudian ratakan array dan dapatkan maks.

Cobalah online!


Bagus, sangat bagus. Saya tidak mencoba untuk mengimplementasikan tantangan ini ketika saya melihatnya sebelumnya, tetapi saya memikirkan teknik yang berbeda dan berharap untuk keluar sekitar 15 byte, jadi ini bagus.
ETHproduksi

Melihat jawaban Sekam, ada cara lain yang efisien: £sY å+Ãc rw(juga 11 byte)
ETHproduk

@ ETHproductions Cukup bagus, saya akan menambahkannya ke jawaban ini sebagai metode alternatif. Mungkinkah itu diperbaiki dengan kombinasi pengurangan / persetujuan, juga seperti itu jawaban Husk?
Justin Mariner

1

Ruby, 61 59 57 byte

Saya baru mulai belajar Ruby, jadi inilah yang saya hasilkan.

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

Saya pertama kali melihat algoritma ini di versi bahasa Finlandia dari buku yang belum selesai ini . Ini dijelaskan dengan sangat baik di halaman 23.

Cobalah online!


1

JavaScript, 58 byte

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

Implementasi JS Golf dari algoritma Kadane. Dibuat sesingkat mungkin. Terbuka untuk saran yang membangun!

Apa yang saya pelajari dari posting ini: nilai balik eval- ketika statment terakhirnya adalah sebuah forloop - pada dasarnya adalah nilai terakhir yang ada di dalam loop. Keren!

EDIT: disimpan empat byte berkat saran Justin dan Hermann.


Anda dapat menghindari returndengan mengganti {...;return b;}dengan eval("...;b")karena eval mengembalikan pernyataan terakhir.
Justin Mariner

@JustinMariner terima kasih! Saya selalu belajar sesuatu yang baru di sini :)
Gaurang Tandon

Anda dapat menghapus dua byte lagi dengan menghapus ;b, karena itu dikembalikan dari for loop
Herman L

@HermanLauenstein Oh, wow, terima kasih, itu berguna!
Gaurang Tandon


0

Python 2 , 52 51 byte

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

Cobalah online!


1
Ini tampaknya bertentangan (persyaratan yang tidak perlu) Jangan membaca apa pun kecuali stdin, dan jangan menulis ke mana pun kecuali stdout.
Tn. Xcoder


0

k , 14 byte

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

Cobalah online!

            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 byte

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

Cobalah online!(dimodifikasi sehingga akan berjalan di TryAPL)

Bagaimana?

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

0

CJam, 24 byte

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

Fungsi yang mengambil array angka sebagai input.

Cobalah secara Online

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

SAYA , 11 byte

⎕𝟚35ǵ'ƒ⇹(⍐↵

Cobalah online! MY ada di TIO sekarang! Woo hoo!

Bagaimana?

  • = input yang dievaluasi
  • 𝟚 = subvektor
  • 35ǵ'= chr(0x53)(Σ, jumlah)
  • ƒ = string sebagai fungsi SAYA
  • = peta
  • ( = berlaku
  • = maksimum
  • = keluaran dengan baris baru.

Jumlah telah diperbaiki ( 0pada array kosong) agar ini berfungsi. Produk juga diperbaiki.


0

J, 12 byte

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

Mirip dengan solusi K zgrep: jumlah pindaian semua sufiks (menghasilkan matriks), meratakan, ambil maks

Cobalah online!

CATATAN

untuk tidak terlalu banyak byte, Anda bisa mendapatkan solusi yang efisien (19 byte golf):

[: >./ [: ({: - <./)\ +/\

0

Aksioma, 127 byte

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)

Ini akan menjadi O (# a ^ 3) Algo; Saya menyalinnya dari hasil C ++ one ...

(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 byte

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

Saya tidak menemukan cara yang lebih baik untuk menghasilkan array daftar sub .


0

Java 8, 242 byte

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

Coba di sini.

106 byte tanpa menggunakan persyaratan 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;}

Coba di sini.

Penjelasan:

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.