Cod sursa(job #2771799)

Utilizator AsandeiStefanAsandei Stefan-Alexandru AsandeiStefan Data 29 august 2021 12:21:27
Problema Subsecventa de suma maxima Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <fstream>
#include <vector>
#include <cstdlib>

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

struct element {
	int value;
	int start_pos;
	int end_pos;

	element& operator= (const element& other) {
		this->value = other.value;
		this->start_pos = other.start_pos;
		this->end_pos = other.end_pos;
		return *this;
	}
};

int n;
int v[6000010];
element dp[6000010];

element solve(int n) {
	if(n == 0) {
		dp[0].value = v[0];
		dp[0].start_pos = 0;
		dp[0].end_pos = 0;
 		return dp[0];
	}

	dp[n - 1] = solve(n - 1);

	if (dp[n - 1].value + v[n] > v[n]) {
		dp[n].value = dp[n - 1].value + v[n];
		dp[n].end_pos = dp[n-1].end_pos+1;
		dp[n].start_pos = dp[n - 1].start_pos;
		return dp[n];
	}
	else {
		dp[n].value = v[n];
		dp[n].start_pos = n;
		dp[n].end_pos = n;
		return dp[n];
	}
}


int main() {
	fin >> n;

	for (int i = 0; i < n; i++) {
		fin >> v[i];
	}

	solve(n);

	element m = { INT32_MIN, 0, 0 };
	for (int i = 0; i < n; i++) {
		if (m.value < dp[i].value) {
			m = dp[i];
		}
	}

	fout << m.value << ' ' << m.start_pos+1 << ' ' << m.end_pos+1 << '\n';

	return 0;
}