Pagini recente » Cod sursa (job #2893813) | Cod sursa (job #3223032) | Cod sursa (job #92818) | Cod sursa (job #1697308) | Cod sursa (job #2433470)
#include <fstream>
#include <vector>
using namespace std;
template < class T>
class Pair {
T first;
T second;
public:
Pair() {};
Pair(T const& x, T const& y) {
first = x;
second = y;
}
Pair(Pair<T> const& cp) {
first = cp.getFirst();
second = cp.getSecond();
}
T const getFirst() const {
return first;
}
T const getSecond() const {
return second;
}
};
class Solution {
int n;
vector<int> v;
vector<Pair<int>> index;
Pair<int> indexSol;
public:
void readData() {
ifstream f("ssm.in");
f >> n;
v.resize(n + 1);
index.resize(n + 1);
for (int i = 1; i <= n; ++i) {
f >> v[i];
}
}
int SSM() {
vector<int> dp(n + 1); // vector cu n + 1 elemente (indexarea incepe de la 0)
// am nevoie de dp[1], ..., dp[n]
// caz de baza
dp[1] = v[1];
index[1] = Pair<int>(1, 1);
// caz general
for (int i = 2; i <= n; ++i) {
if (dp[i - 1] >= 0) {
// extinde la dreapta cu v[i]
dp[i] = dp[i - 1] + v[i];
index[i] = Pair<int>(index[i-1].getFirst(), i);
}
else {
// incep o noua secventa
dp[i] = v[i];
index[i] = Pair<int>(i, i);
}
}
// solutia e maximul din vectorul dp
int sol = dp[1];
for (int i = 2; i <= n; ++i) {
if (dp[i] > sol) {
sol = dp[i];
indexSol = index[i];
}
}
return sol; // aceasta este suma asociata cu SSM
}
void print() {
ofstream g("ssm.out");
int ans = SSM();
g << ans << ' ' << indexSol.getFirst() << ' ' << indexSol.getSecond() << '\n';
g.close();
}
};
int main() {
Solution sol;
sol.readData();
sol.print();
}