Cod sursa(job #1122791)

Utilizator alexandru.huleaAlexandru Hulea alexandru.hulea Data 25 februarie 2014 20:28:01
Problema Subsecventa de suma maxima Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.96 kb
#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;
}