Skip to main content

KADANE's ALGORITHM

#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>

using namespace std;

int main() {

int n;
cin >> n;

vector<int> v(n);

for (int i = 0; i < n; i++) {
cin >> v.at(i);
}

/*BEST IMPLEMENTATION OF KADEN's ALGORITHM to solve
"SUBARRAY WITH THE MAXIMUM SUM or "MAXIMUM CONTAGIOUS SUBARRAY": */
int sum = 0, ans = INT_MIN;
for (int i = 0; i < n; i++) {
sum += v.at(i);
ans = max(ans, sum); //always assign it before max(sum, 0).
sum = max(sum, 0);
}
cout << ans << "\n";
//It prints the MAXIMUM SUBARRAY SUM or
//IF ALL THE ELEMENTS ARE -ve, then it prints ONLY THE MAXIMUM -ve NUMBER (only if the the "max(sum, ans)" is applied before "max(sum, 0)").




//ALSO
/*

//KADEN's ALGORITHM to solve SUBARRAY WITH THE MAXIMUM SUM or "MAXIMUM CONTAGIOUS SUBARRAY"
int sum = 0, ans = INT_MIN;
for (int i = 0; i < n; i++) {
sum += v.at(i);
if(sum<0) {
sum=0;
}
if (sum > ans) { //or ans=max(ans, sum);
ans = sum;
}
}

cout<<ans;

*/


/*###################################*/
/*###################################*/
/*###################################*/
/*###################################*/
/*###################################*/

//KAADANE's ALGORITHM for "( MAXIMUM SUM OF CIRCULAR SUBARRAY )" ⏩
/*

#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>

using namespace std;

int kadane(vector<int> v) {
int sum = 0, ans = INT_MIN;
for (int i = 0; i < v.size(); i++) {
sum += v.at(i);
ans = max(ans, sum);
sum = (sum, 0);
}
return ans;
}

int main() {

freopen("inputf.in", "r", stdin);
freopen("outputf.in", "w", stdout);

int n;
cin >> n;

vector<int> v(n);

for (int i = 0; i < n; i++) {
cin >> v.at(i);

}

int nonwrap = kadane(v);

int wrap;
int total = 0;
for (int i = 0; i < n; i++) {
total += v.at(i);
v.at(i) = -v.at(i); //This will find the sum of the "non-wrapping SubArray which is to be removed."
}

wrap=total-(-kadane(v)); //as vector(v) has been made -ve, So " [-(sum of -ve vector(v))] ".

cout << max(wrap, nonwrap);

return 0;

}
//<==Ending of MAXIMUM SUM OF CIRCULAR SUBARRAY
*/

/*###################################*/
/*###################################*/
/*###################################*/
/*###################################*/
/*###################################*/


/* //Using (Range For Loop) also called (For-each Loop) instead of for loop⏩
int sum=0, ans=INT_MIN;
for (auto el:v) {
sum+= el;
ans=max(ans,sum);
sum=max(sum,0);
}
cout<<ans<<"\n";
*/

return 0;
}