Pagini recente » Cod sursa (job #1890967) | Cod sursa (job #2072980) | Cod sursa (job #1337196) | Cod sursa (job #355170) | Cod sursa (job #1122791)
#include <iostream>
#include <vector>
#include <fstream>
#include <algorithm>
using namespace std;
int max_subseq_sum(vector<int> &v, int left, int right, int* start, int* end) {
if ( left == right )
{
*start = left;
*end = left;
return v[left];
}
int center = (left + right)/2;
int max_left_sum = max_subseq_sum(v, left, center, start, end);
int save_start = *start;
int save_end = *end;
// cout << "max left: " << max_left_sum << ", start: " << start << ", end: " << end << "\n";
int max_right_sum = max_subseq_sum(v, center + 1, right, start, end);
// cout << "max right: " << max_right_sum << ", start: " << start << ", end: " << end << "\n";
/*
Calculez subsecventa suma maxima din stanga care contine si pozitia center
Calculez subsecventa suma maxima din dreapta care contine si pozitia center + 1
*/
int max_left = v[center];
int left_from_center = 0;
int left_poz = center;
for ( int i = center; i >= left; i--) {
left_from_center += v[i];
if (max_left < left_from_center) {
max_left = left_from_center;
left_poz = i;
}
}
int max_right = v[center + 1];
int right_from_center = 0;
int right_poz = center + 1;
for ( int i = center + 1 ; i <= right; i++) {
right_from_center += v[i];
if (max_right < right_from_center) {
max_right = right_from_center;
right_poz = i;
}
}
if (max_left_sum > max_right_sum) {
if (max_left_sum > max_left + max_right) {
*start = save_start;
*end = save_end;
return max_left_sum;
}
else {
*start = left_poz;
*end = right_poz;
return max_left + max_right;
}
}
else {
if (max_left + max_right > max_right_sum ) {
*start = left_poz;
*end = right_poz;
return max_left + max_right;
}
else return max_right_sum;
}
}
int main() {
std::ifstream f("ssm.in");
ofstream g("ssm.out");
vector<int> v;
int n;
f >> n;
for (int i = 0; i < n; i++) {
int aux;
f >> aux;
v.push_back(aux);
}
int start = 0;
int end = 0;
// for (int i = 0; i < v.size(); i++)
// cout << v[i] << " ";
int result = max_subseq_sum(v, 0, v.size() - 1, &start, &end);
// cout << "Subsecventa de suma maxima este: ";
// for (int i = start; i <= end; i++) {
// cout << v[i] << " ";
//}
//cout << "\n" << "Suma este: " << result << "\n";
g << result << " " << start + 1 << " " << end + 1;
f.close();
g.close();
system("pause");
return 0;
}