Pagini recente » Cod sursa (job #2424777) | Cod sursa (job #3138101) | Cod sursa (job #3181136) | Cod sursa (job #2348687) | Cod sursa (job #3269993)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin ("ssm.in");
ofstream cout ("ssm.out");
int n, x,i1,i2;
vector <int> s;
// găsește SSM pentru vectorul v cu n elemente
// pentru a menține convenția din explicații:
// - elementele sunt indexate de la 0, dar le folosesc doar pe cele care incep de la 1
// => v[1], ..., v[n]
int SSM(int p, vector<int> &v) {
vector<int> dp(p + 1); // vector cu n + 1 elemente (indexarea începe de la 0)
// am nevoie de dp[1], ..., dp[n]
// caz de bază
dp[1] = v[1];
// caz general
for (int i = 2; i <= p; ++i) {
if (dp[i - 1] >= 0) {
// extinde la dreapta cu v[i]
dp[i] = dp[i - 1] + v[i], i2 ++;
} else {
// încep o nouă secvență
dp[i] = v[i], i1 = i, i2 = i;
}
}
// soluția e maximul din vectorul dp
int sol = dp[1];
for (int i = 2; i <= p; ++i) {
if (dp[i] > sol) {
sol = dp[i];
}
}
return sol; // aceasta este suma asociată cu SSM
}
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
cin >> x, s.push_back(x);
cout << SSM (n, s) << ' ' << i1 + 1 << ' ' << i2 - 1;
return 0;
}