Pagini recente » Cod sursa (job #237195) | Cod sursa (job #331723) | Cod sursa (job #909287) | Cod sursa (job #2538505) | Cod sursa (job #3239101)
#include <bits/stdc++.h>
using namespace std;
/**
* @brief substring inseamna elem consecutive
* 12345 --> exemple 123, 345
*
* dp[i] = suma substringului de sumă maximă (suma SSM) folosind doar
* primele i elemente din vectorul v și care se termină pe poziția i
*/
class Task { // T = O(n), S = O(1)
public:
void solve() {
read_input();
get_result();
print_output();
}
private:
int32_t n;
int32_t dp;
int32_t start;
int32_t end;
int32_t sol;
vector<int32_t> v;
void read_input() {
ifstream fin("ssm.in");
fin >> n;
v.resize(n + 1);
for (int i = 1; i <= n; i++) {
fin >> v[i];
}
fin.close();
}
void get_result() {
// caz de baza: un singur element
start = 1;
end = 1;
dp = v[1];
sol = v[1];
int idx;
// caz general
for (int i = 2; i <= n; ++i) {
if (dp >= 0) {
dp += v[i];
} else {
dp = v[i];
idx = i;
}
if (sol < dp) {
sol = dp;
start = idx;
end = i;
}
}
}
void print_output() {
ofstream fout("ssm.out");
fout << sol << " " << start << " " << end << "\n";
fout.close();
}
};
int main() {
auto* task = new (nothrow) Task();
if (!task) {
std::cerr << "new failed\n";
return -1;
}
task->solve();
delete task;
return 0;
}