πŸ§ Π—Π°Π΄Π°Ρ‡Π° ΠΎ максимальной суммС подмассива (Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ КаданС) Π‘++



Π”Π°Π½ цСлочислСнный массив, Π½Π°ΠΉΠ΄ΠΈΡ‚Π΅ Π² Π½Π΅ΠΌ Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½Ρ‹ΠΉ подмассив с наибольшСй суммой.



НапримСр:

Input: {-2, 1, -3, 4, -1, 2, 1, -5, 4}



Output: Subarray with the largest sum is {4, -1, 2, 1} with sum 6.




ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π»Π΅Π³ΠΊΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ эту Π·Π°Π΄Π°Ρ‡Ρƒ Π·Π° Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ врСмя, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Алгоритм КаданС.

ИдСя состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ (с ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ суммой) подмассив, β€œΠ·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉΡΡβ€ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ индСксС Π΄Π°Π½Π½ΠΎΠ³ΠΎ массива. Π­Ρ‚ΠΎΡ‚ подмассив Π»ΠΈΠ±ΠΎ пуст (Π² этом случаС Π΅Π³ΠΎ сумма Ρ€Π°Π²Π½Π° Π½ΡƒΠ»ΡŽ), Π»ΠΈΠ±ΠΎ состоит Π½Π° ΠΎΠ΄ΠΈΠ½ элСмСнт большС, Ρ‡Π΅ΠΌ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ подмассив, ΠΎΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉΡΡ Π½Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ индСксС.



Алгоритм ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π½Π° C++:

#include <iostream>

#include <vector>

using namespace std;



// Ѐункция для нахоТдСния максимальной суммы Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎΠ³ΠΎ подмассива

// Π² Π·Π°Π΄Π°Π½Π½ΠΎΠΌ цСлочислСнном массивС

int kadane(vector<int> const &arr)

{

// сохраняСт ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ суммарный подмассив, Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹ΠΉ Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚

int max_so_far = 0;



// сохраняСт ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ сумму подмассива, Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎΡΡ Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ

int max_ending_here = 0;



// ΠΎΠ±Ρ…ΠΎΠ΄ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ массива

for (int i = 0; i < arr.size(); i++)

{

// ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ сумму подмассива, "Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎΡΡ" Π½Π° индСксС "i" (ΠΏΡƒΡ‚Π΅ΠΌ добавлСния

// Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ элСмСнт Π΄ΠΎ максимальной суммы, Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‰Π΅ΠΉΡΡ Π½Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ индСксС 'i-1')

max_ending_here = max_ending_here + arr[i];



// Ссли максимальная сумма ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Π°, устанавливаСм Π΅Π΅ Π² 0 (Ρ‡Ρ‚ΠΎ прСдставляСт

// пустой подмассив)

max_ending_here = max(max_ending_here, 0);



// ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, Ссли тСкущая сумма подмассива окаТСтся большС

max_so_far = max(max_so_far, max_ending_here);

}



return max_so_far;

}



int main()

{

vector<int> arr = { -2, 1, -3, 4, -1, 2, 1, -5, 4 };



cout << "The maximum sum of a contiguous subarray is " << kadane(arr);



return 0;

}




Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:



The maximum sum of a contiguous subarray is 6



ВрСмСнная ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹ΡˆΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π²Π½Π° O(n) ΠΈ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ мСста, Π³Π΄Π΅ n это Ρ€Π°Π·ΠΌΠ΅Ρ€ Π²Π²ΠΎΠ΄Π°.



ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠ΄ Π½Π΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ случай, ΠΊΠΎΠ³Π΄Π° всС элСмСнты массива ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅. Если массив содСрТит всС ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ значСния, ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠΌ являСтся ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ элСмСнт. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π»Π΅Π³ΠΊΠΎ Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ. Π Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π½ΠΈΠΆΠ΅ Π½Π° C++:



ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅



@cpluspluc