π§ ΠΠ°Π΄Π°ΡΠ° ΠΎ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΉ ΡΡΠΌΠΌΠ΅ ΠΏΠΎΠ΄ΠΌΠ°ΡΡΠΈΠ²Π° (Π°Π»Π³ΠΎΡΠΈΡΠΌ ΠΠ°Π΄Π°Π½Π΅) Π‘++
ΠΠ°Π½ ΡΠ΅Π»ΠΎΡΠΈΡΠ»Π΅Π½Π½ΡΠΉ ΠΌΠ°ΡΡΠΈΠ², Π½Π°ΠΉΠ΄ΠΈΡΠ΅ Π² Π½Π΅ΠΌ Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½ΡΠΉ ΠΏΠΎΠ΄ΠΌΠ°ΡΡΠΈΠ² Ρ Π½Π°ΠΈΠ±ΠΎΠ»ΡΡΠ΅ΠΉ ΡΡΠΌΠΌΠΎΠΉ.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ Π»Π΅Π³ΠΊΠΎ ΡΠ΅ΡΠΈΡΡ ΡΡΡ Π·Π°Π΄Π°ΡΡ Π·Π° Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΠ»Π³ΠΎΡΠΈΡΠΌ ΠΠ°Π΄Π°Π½Π΅.
ΠΠ΄Π΅Ρ ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ (Ρ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΡΡΠΌΠΌΠΎΠΉ) ΠΏΠΎΠ΄ΠΌΠ°ΡΡΠΈΠ², βΠ·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°ΡΡΠΈΠΉΡΡβ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ½Π΄Π΅ΠΊΡΠ΅ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΌΠ°ΡΡΠΈΠ²Π°. ΠΡΠΎΡ ΠΏΠΎΠ΄ΠΌΠ°ΡΡΠΈΠ² Π»ΠΈΠ±ΠΎ ΠΏΡΡΡ (Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π΅Π³ΠΎ ΡΡΠΌΠΌΠ° ΡΠ°Π²Π½Π° Π½ΡΠ»Ρ), Π»ΠΈΠ±ΠΎ ΡΠΎΡΡΠΎΠΈΡ Π½Π° ΠΎΠ΄ΠΈΠ½ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π±ΠΎΠ»ΡΡΠ΅, ΡΠ΅ΠΌ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΠΏΠΎΠ΄ΠΌΠ°ΡΡΠΈΠ², ΠΎΠΊΠ°Π½ΡΠΈΠ²Π°ΡΡΠΈΠΉΡΡ Π½Π° ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌ ΠΈΠ½Π΄Π΅ΠΊΡΠ΅.
ΠΠ»Π³ΠΎΡΠΈΡΠΌ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ Π½Π° C++:
ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ:
The maximum sum of a contiguous subarray is 6
ΠΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π²ΡΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΠ°Π²Π½Π° O(n) ΠΈ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΡΠ°, Π³Π΄Π΅ n ΡΡΠΎ ΡΠ°Π·ΠΌΠ΅Ρ Π²Π²ΠΎΠ΄Π°.
ΠΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠΉ Π²ΡΡΠ΅ ΠΊΠΎΠ΄ Π½Π΅ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΡΠ»ΡΡΠ°ΠΉ, ΠΊΠΎΠ³Π΄Π° Π²ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΌΠ°ΡΡΠΈΠ²Π° ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΡΠ΅. ΠΡΠ»ΠΈ ΠΌΠ°ΡΡΠΈΠ² ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π²ΡΠ΅ ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΠΎΡΠ²Π΅ΡΠΎΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ. ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ Π»Π΅Π³ΠΊΠΎ ΡΠ°Π·ΠΌΠ΅ΡΡΠΈΡΡ ΡΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ ΠΏΠ΅ΡΠ΅Π΄ ΡΠ΅ΠΌ, ΠΊΠ°ΠΊ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌ. Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²ΠΈΠ΄Π΅ΡΡ Π½ΠΈΠΆΠ΅ Π½Π° C++:
ΠΡΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅
@cpluspluc
ΠΠ°Π½ ΡΠ΅Π»ΠΎΡΠΈΡΠ»Π΅Π½Π½ΡΠΉ ΠΌΠ°ΡΡΠΈΠ², Π½Π°ΠΉΠ΄ΠΈΡΠ΅ Π² Π½Π΅ΠΌ Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½ΡΠΉ ΠΏΠΎΠ΄ΠΌΠ°ΡΡΠΈΠ² Ρ Π½Π°ΠΈΠ±ΠΎΠ»ΡΡΠ΅ΠΉ ΡΡΠΌΠΌΠΎΠΉ.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
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