Прибуток#2585

Прибуток (Розбір)

В задачі слід знайти таку підпослідовність підрядних чисел, яка матиме максимально можливу суму серед усіх можливих таких підпослідовностей. Якщо на підпослідовності x_i, x_{i+1}, ..., x_j досягається максимальна сума, то для будь-якого k, 1 \le k < i і l, j < l \le n сума елементів x_k, ..., x_{i-1} і x_{j+1}, ..., x_l буде від'ємною.

Алгоритм Кадане. Рухаємось по масиву зліва направо і накопичуємо у змінній поточну часткову суму. Якщо в якийсь момент буде від'ємною, то присвоюємо s = 0. Максимум з усіх значень змінної за час проходу по масиву буде відповіддю на задачу.

Приклад

Для вхідної послідовності максимальний прибуток дорівнює .

Розглянемо приклад послідовності . Побудуємо часткові суми. Поточне значення часткової суми обнуляємо, коли сума стає меншою нуля і починаємо підрахунок суми з наступного числа. Максимальне значення серед усіх часткових сум дорівнює , що і є відповіддю. Шукана підпослідовність буде 4, -2, 4.

Реалізація алгоритму

Читаємо довжину послідовності . Обнуляємо значення максимального прибутку і поточної часткової суми .

scanf("%d",&n);
s = 0; max = 0;

Читаємо чисел. Кожне прочитане число додаємо до поточної суми і перераховуємо поточне значення прибутку . Якщо на якому-небудь кроці значення стало від'ємним, то встановлюємо його в нуль і продовжуємо процес.

for(i = 0; i < n; i++)
{
  scanf("%d",&Number);
  s += Number;
  if (s > max) max = s;
  if (s < 0) s = 0;
}

Виводимо результат.

printf("%d\n",max);

Java реалізація

import java.util.*;

public class Main
{
  public static void main(String[] args)
  {
    Scanner con = new Scanner(System.in);
    int n = con.nextInt();

    int s = 0, max = 0;
    for (int i = 0; i < n; i++)
    {
      int val = con.nextInt();
      s += val;
      if (s > max) max = s;
      if (s < 0) s = 0;
    }
    
    System.out.println(max);
    con.close();
  }
}

Python реалізація

Читаємо довжину послідовності . Обнуляємо значення максимального прибутку max\_profit і поточної часткової суми .

n = int(input())
s = 0
max_profit = 0

Читаємо чисел. Кожне прочитане число додаємо до поточної суми і перераховуємо поточне значення прибутку max\_profit. Якщо на якому-небудь кроці значення стало від'ємним, то встановлюємо його в нуль і продовжуємо процес.

for i in range(n):
  Number = int(input())
  s += Number
  if s > max_profit: max_profit = s
  if s < 0: s = 0

Виводимо результат.

print(max_profit)