Algoritmo:segmento di somma vicina a zero

14th
sono riuscito a fare l'algoritmo che calcola il segmento di somma massima che metto qui di seguito:
int main(){
	const int n=10;
	int v[n]={-7,4,-8,3,4,-2,6,-10,1,3};
	
	int somma=0;
	int sommamax=0;
	
	for(int i=0;i<n;i++){
		if(somma>0)somma+=v[i];
		else somma=v[i];
		if(sommamax<somma)sommamax=somma;
	}
	cout<<sommamax<<endl;
	
	return 0;
}

il mio problema adesso è che invece di calcolare il sottovettore la cui somma di elementi è massima,
voglio calcolare il sottovettore la cui somma di elementi è la più vicina a 0.
ho provato a risolvere il problema con il seguente algoritmo:
int main(){
	const int n=4;
	int v[n]={-7,3,-2,6};
	
	int somma=0;
	int sommamax=10;
	
	for(int i=0;i<n;i++){
		if(abs(somma)+v[i]>abs(sommamax))somma=v[i];
		else somma+=v[i];
		if(abs(sommamax)>abs(somma))sommamax=somma;
	}
	cout<<sommamax<<endl;
	
	return 0;
}

che ovviamente non funziona, io ero abbastanza sicuro che una volta risolto il problema del segmento di somma massima questo mi sarebbe stato piuttosto facile... e invece no.
grazie in anticipo a chi mi dice cosa sbaglio.

Risposte
apatriarca
Il problema è che il segmento di somma massima e il segmento con somma più vicina a zero hanno proprietà diverse e non è possibile usare lo stesso metodo per entrambe.

Giova411
In teoria con due cicli (quindi $O (n^2 )$ ) si può fare.
Per ogni elemento, trovi la somma di esso con ogni altro elemento del vettore da controllare e confronti tale somme.
Col valore assoluto dovresti beccare quella esatta.
Ma penso si possa fare meglio, tipo come un ordinamento $O( n logn)$
Ma aspetta che Apa o Vic confermino, non ti fidare di me :oops:

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.