Mảng phụ tối đa


21

Xác định "mảng con tối đa" của một mảng nhất định là "mảng con (liên tiếp) có tổng lớn nhất". Lưu ý không có yêu cầu "khác không". Đầu ra tổng đó.

Đưa ra một mô tả về mã của bạn nếu có thể.

Mẫu đầu vào 1:

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

Mẫu đầu ra 1: 24

Mô tả 1:
Số tiền lớn nhất được mang lại bằng cách cắt 6 7 -8 9 10ra và tổng hợp.

Đầu vào mẫu 2: -1 -2 -3
Đầu ra mẫu 2: 0
Mô tả 2: Thật đơn giản :) Một phân đoạn trống là "lớn nhất".

Yêu cầu:

  • Đừng đọc bất cứ thứ gì ngoại trừ stdin và đầu ra sẽ đi đến thiết bị xuất chuẩn.
  • Hạn chế sơ hở tiêu chuẩn áp dụng.

Xếp hạng: Chương trình ngắn nhất sẽ thắng .


5
Viết một chương trình càng ngắn càng tốt. Tôi sẽ khuyên bạn nên xóa yêu cầu này vì nó yêu cầu chúng tôi kiểm tra mọi chương trình có thể bằng ngôn ngữ của chúng tôi và đảm bảo rằng chúng tôi đang sử dụng ngắn nhất.
Okx

Yêu cầu 2 cũng không rõ ràng. Nó có nghĩa là thư viện? Thư viện tùy chỉnh? Gia công chương trình? Thứ hai đã bị cấm bởi các sơ hở tiêu chuẩn.
Leaky Nun

14
Đừng đọc bất cứ thứ gì ngoại trừ stdin và đừng viết thư cho bất cứ nơi nào ngoại trừ thiết bị xuất chuẩn. - Tại sao?
Ông Xcoder

2
Rất giống nhau , có thể là một bản dupe. Cũng rất giống nhau .
xnor

Câu trả lời:


10

Husk , 6 4 byte

▲ṁ∫ṫ

Hãy thử trực tuyến!

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

Bình thường , 8 byte

eS+0sM.:

Hãy thử trực tuyến!


Làm sao?

eS + 0sM .: Q - Q là ẩn, nghĩa là đầu vào. Hãy nói rằng đó là [-1, -2, -3].

      .: - Tất cả các danh sách con không trống liền kề. Chúng tôi có [[-1], [-2], [-3], [-1, -2], [-2, -3], [-1, -2, -3]].
    sM - Lấy tổng của từng danh sách con. [-1, -2, -3, -3, -5, -6]
  +0 - Nối 0 vào danh sách tổng. [0, -1, -2, -3, -3, -5, -6]
eS - Phần tử tối đa. S cho ta [-6, -5, -3, -3, -2, -1, 0], trong khi e trả về 0, phần tử cuối cùng.

4

05AB1E , 4 byte

Ό0M

Hãy thử trực tuyến!

-1 cảm ơn Ad Nam .


Mẹo tương tự như với câu trả lời của Okx: ÎŒOMnên hoạt động với 4 byte.
Ad Nam

@Adnan Cảm ơn tôi nghĩ rằng chỉ có tích hợp "1 và đầu vào" ... chờ đã ... phải không? Họ không nên được nối hay cái gì đó?
Erik the Outgolfer

Không, Mtìm kiếm số lượng lớn nhất trong phiên bản dẹt của ngăn xếp.
Ad Nam

@Adnan ok ... đây là tin tức với tôi lol
Erik the Outgolfer


3

C ++, 197 195 187 byte

-10 byte nhờ 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;}

Bạn có thể loại bỏ niềng răng sau vòng lặp đầu tiên?
Zacharý

Ngoài ra, tại sao bạn có lhdù sao?
Zacharý

@ Zacharý l và h là chỉ số bắt đầu và kết thúc của mảng phụ
HatsuPulumKun

3

R , 54 byte

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

Hãy thử trực tuyến!

Thuật toán lấy từ: Vấn đề subarray tối đa

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

Hãy thử trực tuyến!

  • Đọc xtừ stdin.
  • Đặt ylàm chỉ mục của x.
  • Lặp lại hai lần trên tất cả các tập con không trống có thể.
  • So sánh tổng của một tập hợp con với m(ban đầu m=0).
  • Lưu trữ giá trị tối đa trong m.
  • Giá trị in của 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

Hãy thử trực tuyến!

  • Đọc xtừ stdin.
  • Thực hiện tìm kiếm đầy đủ trên tất cả các tập hợp con không trống có thể.
  • So sánh tổng của một tập hợp con với m(ban đầu m=0).
  • Lưu trữ giá trị tối đa trong m.
  • Giá trị in của m.

Những ý tưởng không thành công khác

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=0làm việc quá Ngoài ra, bạn cần phải xử lý in ấn đầu ra. Khi chạy như một chương trình đầy đủ (thông qua source), điều này không in bất cứ điều gì.
JAD

@JarkoDubbeldam, tôi đã thêm cat(b), nhưng nếu có nguồn gốc echo=TRUEthì đủ để gọi bcho bản in.
djhurio

Tôi đoán không có một định nghĩa rõ ràng về cách các chương trình đầy đủ được chạy trong R. Có rscript trong dòng lệnh và nguồn trong chính R. Nhưng thông thường các cờ cần thiết khi chạy tập lệnh được bao gồm trong bytecount. (Cá nhân tôi đã quản lý để có được rscript hoạt động tốt với quét, nhưng đó là một điều khác.
JAD

Bạn có thể sử dụng T=Fthay vì a=b=0để cứu hai byte, vì maxsẽ ép buộc bđể numeric.
Giuseppe

3

Haskell , 28 byte

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

Hãy thử trực tuyến!


Sẽ không phải là tối đa luôn luôn là yếu tố cuối cùng trong trả lại scanl? vậy sao foldl((max<*>).(+))0??
matthias

NVM tôi thấy lỗi của mình!
matthias

@matthias Nếu bạn thấy lịch sử chỉnh sửa, bạn sẽ thấy rằng tôi đã mắc lỗi sma. :-)
H.PWiz




1

Japt , 11 byte

£ãY mxÃc rw

Hãy thử trực tuyến!

Giải trình

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

Phương pháp thay thế, 11 byte

Từ @ETHproductions; dựa trên câu trả lời Husk của Lực lượng Brute .

£sY å+Ãc rw

Nhận tất cả các đuôi của mảng đầu vào và tích lũy từng cái. Sau đó làm phẳng mảng và được max.

Hãy thử trực tuyến!


Đẹp, thực sự tốt đẹp. Tôi đã không thử thực hiện thử thách này khi tôi thấy nó sớm hơn, nhưng tôi đã nghĩ đến một kỹ thuật khác và dự kiến ​​nó sẽ xuất hiện khoảng 15 byte, vì vậy điều này thật tuyệt.
Sản xuất ETH

Nhìn vào câu trả lời của Husk, có một cách hiệu quả khác: £sY å+Ãc rw(cũng là 11 byte)
ETHproductions

@ETHproductions Khá hay, tôi sẽ thêm câu đó vào câu trả lời này như một phương pháp thay thế. Điều đó có thể được cải thiện với một số kết hợp giảm / concat, cũng giống như câu trả lời của Husk không?
Justin Mariner

1

Ruby, 61 59 57 byte

Tôi mới bắt đầu học Ruby, vì vậy đây là những gì tôi nghĩ ra.

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

Lần đầu tiên tôi thấy thuật toán này ở phiên bản Phần Lan của cuốn sách còn dang dở này . Nó được giải thích rất tốt ở trang 23.

Hãy thử trực tuyến!


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)")

Thực hiện mã hóa của thuật toán Kadane. Làm càng ngắn càng tốt. Mở để đề xuất xây dựng!

Những gì tôi học được từ bài đăng này: giá trị trả về của eval- khi thống kê cuối cùng của nó là một forvòng lặp - về cơ bản là giá trị cuối cùng hiện diện bên trong vòng lặp. Mát mẻ!

EDIT: đã lưu bốn byte nhờ các đề xuất của Justinin và Hermann.


Bạn có thể tránh returnbằng cách thay thế {...;return b;}bằng eval("...;b")vì eval trả về câu lệnh cuối cùng.
Justin Mariner

@JustinMariner cảm ơn! tôi luôn học được điều gì đó mới ở đây :)
Gaurang Tandon

Bạn có thể xóa thêm hai byte bằng cách xóa ;b, vì nó được trả về từ vòng lặp for
Herman L

@HermanLauenstein Oh, wow, cảm ơn, điều đó hữu ích!
Gaurang Tandon


0

Python 2 , 52 51 byte

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

Hãy thử trực tuyến!


1
Điều này dường như mâu thuẫn (không cần thiết) yêu cầu Đừng đọc bất cứ điều gì ngoại trừ stdin và không viết thư cho bất cứ nơi nào ngoại trừ thiết bị xuất chuẩn.
Ông Xcoder


0

k , 14 byte

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

Hãy thử trực tuyến!

            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←⎕

Hãy thử trực tuyến!(đã sửa đổi để nó sẽ chạy trên TryAPL)

Làm sao?

  • ∊∘.{+/W[X/⍨⍺≤X←⍳⍵]}⍨⍳⍴W←⎕ Tạo tổng của các tiểu đơn vị
  • ⌈/ Tối đa

0

CJam, 24 byte

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

Hàm lấy mảng số làm đầu vào.

Dùng thử trực tuyến

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

TÔI , 11 byte

⎕𝟚35ǵ'ƒ⇹(⍐↵

Hãy thử trực tuyến! Bây giờ tôi đang ở trên TIO! Woohoo!

Làm sao?

  • = đánh giá đầu vào
  • 𝟚 = phân ngành
  • 35ǵ'= chr(0x53)(Σ, tổng)
  • ƒ = chuỗi dưới dạng hàm MY
  • = bản đồ
  • ( = áp dụng
  • = tối đa
  • = đầu ra với một dòng mới.

Tổng đã được cố định ( 0trên các mảng trống) để làm việc này. Sản phẩm cũng đã được sửa.


0

J, 12 byte

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

Tương tự như giải pháp K của zgrep: tổng quét của tất cả các hậu tố (tạo ra ma trận), tách ra, lấy tối đa

Hãy thử trực tuyến!

CHÚ THÍCH

không quá nhiều byte, bạn có thể có được một giải pháp hiệu quả (19 byte được đánh gôn):

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

0

Tiên đề, 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)

Đây sẽ là O (# a ^ 3) Algo; Tôi sao chép nó từ C ++ một ... kết quả

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

Tôi không tìm thấy cách nào tốt hơn để tạo các mảng danh sách phụ .


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

Hãy thử nó ở đây.

106 byte mà không sử dụng yêu cầu 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;}

Hãy thử nó ở đây.

Giải trình:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.