Sub-matriz máxima


21

Defina o "subconjunto máximo" de um determinado conjunto como "um subconjunto (consecutivo) com a maior soma". Observe que não há um requisito "diferente de zero". Saída essa soma.

Dê uma descrição do seu código, se possível.

Entrada de amostra 1:

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

Saída de amostra 1: 24

Descrição 1:
A maior soma é obtida cortando 6 7 -8 9 10e somando.

Exemplo de entrada 2: -1 -2 -3
Exemplo de saída 2: 0
Descrição 2: É simples :) Um subarray vazio é o "maior".

Requerimento:

  • Não leia nada, exceto stdin, e a saída deve ir para stdout.
  • Aplicam-se restrições de brechas padrão .

Ranking: O programa mais curto ganha esse .


5
Escreva um programa o mais curto possível. Eu recomendaria remover esse requisito, pois exige que verifiquemos todos os programas possíveis em nosso idioma e verifique se estamos usando o menor tempo possível.
Okx 12/08/19

O requisito 2 também não é claro. Isso significa bibliotecas? Bibliotecas personalizadas? Terceirização do programa? Este último já é proibido pelas brechas padrão.
Leaky Nun

14
Não leia nada, exceto stdin, e não escreva para qualquer lugar, exceto stdout. - Por quê?
Xcoder 12/08/19

2
Muito parecido , possivelmente um idiota. Também é muito parecido .
Xnor

Respostas:


10

Casca , 6 4 bytes

▲ṁ∫ṫ

Experimente 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

Pitão , 8 bytes

eS+0sM.:

Experimente online!


Quão?

eS + 0sM.: Q - Q está implícito, significando entrada. Digamos que seja [-1, -2, -3].

      .: - Todas as sublistas não vazias contíguas. Temos [[-1], [-2], [-3], [-1, -2], [-2, -3], [-1, -2, -3]].
    sM - Obtenha a soma de cada sub-lista. [-1, -2, -3, -3, -5, -6]
  +0 - Anexe um 0 à lista de soma. [0, -1, -2, -3, -3, -5, -6]
eS - elemento máximo. S nos fornece [-6, -5, -3, -3, -2, -1, 0], enquanto e retorna 0, o último elemento.



3

C ++, 197 195 187 bytes

-10 bytes graças a 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;}

Você pode remover os aparelhos depois do primeiro loop for?
Zachary

Além disso, por que você tem le de hqualquer maneira?
Zachary

@ Zachary l e h foi para o início e o fim do índice da matriz de sub
HatsuPointerKun

3

R , 54 bytes

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

Experimente online!

Algoritmo retirado de: Problema máximo na sub-matriz

R , 65 bytes

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

Experimente online!

  • Ler x partir de stdin.
  • Definir ycomo índice dex .
  • Itere duas vezes em todos os subconjuntos não vazios possíveis.
  • Compare a soma de um subconjunto com m(inicialmente m=0).
  • Armazene o valor máximo em m.
  • Valor de impressão de m.

R , 72 bytes

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

Experimente online!

  • Leia ax partir de stdin.
  • Faça uma pesquisa completa em todos os possíveis subconjuntos não vazios.
  • Compare a soma de um subconjunto com m(inicialmente m=0).
  • Armazene o valor máximo em m.
  • Valor de impressão de m.

Outras idéias malsucedidas

58 bytes

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

63 bytes

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

72 bytes

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

1
a=b=0funciona também Além disso, você precisa lidar com a impressão da saída. Quando executado como um programa completo (por source), isso não imprime nada.
JAD

@JarkoDubbeldam, acrescentei cat(b), mas, se for fornecido com echo=TRUEele, será suficiente para solicitar bimpressão.
djhurio

Eu acho que não há uma definição clara de como os programas completos são executados em R. Há rscript na linha de comando e fonte no próprio R. Mas geralmente os sinalizadores necessários ao executar um script são incluídos no bytecount. (Eu não tenho, pessoalmente, conseguiu RSCRIPT ao trabalho bem com digitalização, mas isso é outra coisa.
JAD

Você pode usar T=Fem vez de a=b=0salvar dois bytes, porque maxvai forçar ba numeric.
Giuseppe





1

Japonês , 11 bytes

£ãY mxÃc rw

Experimente online!

Explicação

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

Método alternativo, 11 bytes

De @ETHproductions; baseado na resposta Husk das Forças Brutas .

£sY å+Ãc rw

Obtém todas as caudas da matriz de entrada e soma cumulativamente cada. Em seguida, nivela a matriz e obtém o máximo.

Experimente online!


Bom, muito bom. Não tentei implementar esse desafio quando o vi anteriormente, mas pensei em uma técnica diferente e esperava que ela fosse lançada em torno de 15 bytes, então isso é ótimo.
ETHproductions

Olhando para a resposta Husk, não há outra maneira eficiente: £sY å+Ãc rw(também 11 bytes)
ETHproductions

@ETHproductions Muito bom, acrescentarei isso a esta resposta como um método alternativo. Isso poderia ser melhorado com alguma combinação de redução / concat, também como a resposta de Husk?
Justin Mariner

1

Ruby, 61 59 57 bytes

Eu comecei a aprender Ruby, então é isso que eu criei.

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

Vi esse algoritmo pela primeira vez na versão finlandesa deste livro inacabado . Está muito bem explicado na página 23.

Experimente online!


1

JavaScript, 58 bytes

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

Implementação JS Golfed do algoritmo de Kadane. Feito o mais curto possível. Aberto a sugestões construtivas!

O que aprendi neste post: o valor de retorno de eval- quando sua última declaração é um forloop - é basicamente o último valor presente dentro do loop. Legal!

EDIT: salvou quatro bytes graças às sugestões de Justin e Hermann.


Você pode evitar o returnsubstituindo {...;return b;}por eval("...;b")eval retorna a última instrução.
23717 Justin Mariner

@JustinMariner thanks! estou sempre aprendendo algo novo aqui :)
Gaurang Tandon

Você pode remover mais dois bytes removendo ;b, pois ele é retornado do loop for
Herman L

@HermanLauenstein Oh, uau, obrigado, isso é útil!
Gaurang Tandon


0

Python 2 , 52 51 bytes

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

Experimente online!


1
Isso parece estar em conflito com o requisito (de outra forma desnecessário). Não leia nada, exceto stdin, e não grave em qualquer lugar, exceto stdout.
Xcoder


0

k , 14 bytes

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

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

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

Experimente online!(modificado para que seja executado no TryAPL)

Quão?

  • ∊∘.{+/W[X/⍨⍺≤X←⍳⍵]}⍨⍳⍴W←⎕ Gerar somas de subvetores
  • ⌈/ Máximo

0

CJam, 24 bytes

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

Função que recebe matriz de números como entrada.

Experimente 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

MY , 11 bytes

⎕𝟚35ǵ'ƒ⇹(⍐↵

Experimente online! MY está no TIO agora! Woohoo!

Quão?

  • = entrada avaliada
  • 𝟚 = subvetores
  • 35ǵ'= chr(0x53)(Σ, soma)
  • ƒ = string como uma função MY
  • = mapa
  • ( = aplicar
  • = máximo
  • = saída com uma nova linha.

A soma foi corrigida ( 0em matrizes vazias) para que isso funcionasse. O produto também foi corrigido.


0

J, 12 bytes

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

Semelhante à solução K do zgrep: a soma da varredura de todos os sufixos (produz uma matriz), raze, take max

Experimente online!

NOTA

por menos bytes demais, você pode obter uma solução eficiente (19 bytes de golfe):

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

0

Axioma, 127 bytes

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)

Isso seria O (# a ^ 3) Algo; Eu copio do C ++ one ... results

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

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

Não encontrei uma maneira melhor de gerar as matrizes das sub- listas .


0

Java 8, 242 bytes

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

Experimente aqui.

106 bytes sem usar o requisito 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;}

Experimente aqui.

Explicação:

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.