Cod sursa(job #3224945)

Utilizator filipinezulDumitrascu Filip Teodor filipinezul Data 16 aprilie 2024 16:43:14
Problema Subsecventa de suma maxima Scor 65
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.79 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;


class Task {
public:
    void solve() {
        read_input();
        get_result();
    }

private:
    int size;
    vector<int> v;

    void read_input() {
        ifstream fin("ssm.in");
        fin >> size;
        for (int i = 0, elem; i < size; i++) {
            fin >> elem;
            v.push_back(elem);
        }

        fin.close();
    }

    void get_result() {
        vector<int> dp(size + 1); // memoizare, unde retin solutia subproblemei
        vector<int> start(size + 1);
        vector<int> end(size + 1);

        // caz de bază, singura subsecventa posibila cu un element
	    dp[1] = v[1]; 
        start[1] = 1;
        end[1] = 1;

        // caz general
        for (int i = 2; i <= size; ++i) {
            if (dp[i - 1] >= 0) { // dp[i − 1] + v[i] >= v[i] are rost sa extind
                dp[i] = dp[i - 1] + v[i];
                start[i] = start[i - 1];
                end[i] = i;
            
            } else { // dp[i − 1] + v[i] < v[i] renunt la subsecventa de pana acum 
                dp[i] = v[i];
                start[i] = i;
                end[i] = i;
            }
        }

        // soluția e maximul din vectorul dp
        int sol = dp[1];
        int strt = start[1];
        int nd = end[1];
        for (int i = 2; i <= size; ++i) {
            if (dp[i] > sol) {
                sol = dp[i];
                strt = start[i];
                nd = end[i];
            }
        }
 
        ofstream fout("ssm.out");
        fout << sol << " " << strt + 1 << " " << nd + 1 << endl;
        fout.close();
    }
};

int main() {
    auto* task = new (nothrow) Task();
    if (!task) {
        cerr << "new failed\n";
        return -1;
    }
    task->solve();
    delete task;
    return 0;
}