Pagini recente » Cod sursa (job #688351) | Cod sursa (job #2133027) | Cod sursa (job #2034086) | Cod sursa (job #2528402) | Cod sursa (job #914818)
Cod sursa(job #914818)
/*
* ssm.cpp
* Subsecventa de suma maxima
*
* Created on: Mar 14, 2013
* Author: Paulichesh
*/
#include <iostream>
#include <fstream>
using namespace std;
int *v,n,*best,*last,*seq,st,dr=-1;
int maxLast(int n)
{
if(n == 0)
{
return last[0]=v[0];
}
if(last[n] > 0) return last[n];
int m1 = maxLast(n-1) + v[n] ;
int m2 = v[n];
if(m1 > m2)
{
last[n] = m1;
}
else
{
last[n] = m2;
}
return last[n];
}
int maxBest(int n)
{
if(n == 0)
{
return best[0]=v[0];
}
if(best[n] > 0) return best[n];
int m1 = maxBest(n-1);
int m2 = maxLast(n);
if(m1 > m2)
{
best[n] = m1;
}
else
{
best[n] = m2;
}
return best[n];
}
void recSol(int n)
{
if(dr==-1 && best[n-1] > last[n])
recSol(n-1);
else
{
if(last[n-1] + v[n] > v[n])
{
if(dr == -1)dr = n;
recSol(n-1);
}
else
{
st = n;
}
}
}
int main()
{
ifstream fin ("ssm.in");
ofstream fout ("ssm.out");
fin >> n;
v = new int[n];
best = new int[n];
last = new int[n];
seq = new int[n];
for(int i=0; i<n; i++)
best[i]=last[i]=0;
for (int i = 0; i < n; i++) {
fin >> v[i];
}
fout << maxBest(n-1)<< " ";
recSol(n-1);
fout << st + 1 << " " << dr + 1 << endl;
/*cout << st << " " << dr << endl;
for (int i = 0; i < n; i++) {
cout << best[i] <<" ";
}
cout << endl;
for (int i = 0; i < n; i++) {
cout << last[i] <<" ";
}
cout << endl;
*/
/*for (int i = 0; i < n; i++) {
cout << seq[i] <<" ";
}
cout << endl;
*/
fin.close();
fout.close();
return 0;
}