Cod sursa(job #2322869)

Utilizator MrRobotMrRobot MrRobot Data 18 ianuarie 2019 15:17:49
Problema Subsecventa de suma maxima Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <limits.h>
using namespace std;

ifstream fin("ssm.in");
ofstream fout("ssm.out");

vector <int> v;

int secvStart, secvStop;

struct secv {
    int suma;
    int s, f;
};

secv maxim( secv a, secv b) {
    if(a.suma > b.suma)
        return a;
    else
        return b;
}

int maxSt = INT_MAX;
int maxDr = INT_MAX;

secv subsMax( int st, int dr ){
    if(st == dr) {
        secv s;
        s.suma = v[st];
        s.s = s.f = st;
        return s;
    }
    int m = (st+dr) / 2;
    secv maxSt = subsMax(st, m);
    secv maxDr = subsMax(m+1, dr);
    int maxStM=0, maxDrM = 0;
    int i, s1=0, s2=0;
    int start, stop;
    for(i=m; i>=st; i--) {
        maxStM += v[i];
        if(maxStM > s1) {
            s1 = maxStM;
            start = i;
        }
    }
    for(i=m+1; i<=dr; i++) {
        maxDrM += v[i];
        if(maxDrM > s2) {
            s2 = maxDrM;
            stop = i;
        }
    }
    //for(i=st; i<=dr; i++) {
    //    cout<<v[i]<<" ";
    //}
    //cout<<endl;
    //cout<<maxSt<<" "<<maxDr<<" "<<s1<<" "<<s2;
    //cout<<endl;
    secv s;
    s.suma = s1+s2;
    s.s = start;
    s.f = stop;
    return maxim( maxim(maxSt, maxDr), s);

}


int main()
{
    int n;
    fin>>n;
    int i;
    v.push_back(INT_MIN);
    for(i=1; i<=n; i++)
    {
        int x;
        fin>>x;
        v.push_back(x);
    }
    secv sol = subsMax(1, n);
    fout<<sol.suma<<" "<<sol.s<<" "<<sol.f;
}