Cod sursa(job #978814)

Utilizator dcm9000Dinu Cristian Mircea - UPB dcm9000 Data 29 iulie 2013 18:56:14
Problema Subsecventa de suma maxima Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include <iostream>
#include <algorithm>
#include <fstream>
#include <string>
#include <vector>

using namespace std;

#define FILE_IN "ssm.in"
#define FILE_OUT "ssm.out"

void max_subvector_sum(const vector<int> &vec, int &sum, int &start_index, int &end_index)
{
    if (vec.empty()) {
        sum = 0;
        start_index = 0;
        end_index = 0;
        return;
    }
    
    // Kadane
    int best_sum = vec[0];
    int best_start = 0;
    int best_length = 1;
    
    int win_sum = 0;
    int win_start = 0;
    int win_length = 0;
    
    for (unsigned int i = 0; i < vec.size(); i++) {
        win_sum += vec[i];
        
        if (win_sum < 0) {
            win_sum = vec[i];
            win_start = i;
            win_length = 1;
        } else {
            win_length++;
        }
        
        if (win_sum > best_sum) {
            best_sum = win_sum;
            best_start = win_start;
            best_length = win_length;
        }
        
        if (win_sum < 0) {
            win_sum = 0;
            win_start = i + 1;
            win_length = 0;
        }
    }
    
    sum = best_sum;
    start_index = best_start + 1;
    end_index = best_start + best_length;
}

int main()
{
    ifstream fisIn(FILE_IN);
    ofstream fisOut(FILE_OUT);

    int N;
    vector<int> V;
    
    fisIn >> N;
    for (int i=0; i<N; i++) {
        int temp;
        fisIn >> temp;
        V.push_back(temp);
    }

    int sum, start_index, end_index;
    max_subvector_sum(V, sum, start_index, end_index);
    
    fisOut << sum << " " << start_index << " " << end_index << endl;
}