# initialisation as before $cur = $best = $array[$cur_start] if @array; for (1..$#array) { $cur += $array[$_]; if ($best < $cur) { $best = $cur; $best_start = $cur < 0 ? $_ : $cur_start; $best_end = $_; } elsif ($cur < 0) { $cur = 0; $cur_start = $_ + 1; } } #### #! /usr/bin/perl -w use strict; my @array = @ARGV ? @ARGV : qw(3 2 8 9 -25 5 8 4 4 -3 5 3 -10); my $cur = my $best = my $best_start = my $cur_start = 0; my $best_end = -1; for (0 .. $#array) { my $elem = $array[$_]; if ($elem < 0) { if (!$best or $best <= $elem) { $cur = $best = $elem; $best_start = $best_end = $_; } } else { $cur_start = $best_start = $best_end = $_; $cur = $best = $elem; last; } } for ($best_end+1..$#array) { $cur += $array[$_]; if ($cur < 0) { $cur = 0; $cur_start = $_ + 1; } elsif ($best < $cur) { $best = $cur; $best_start = $cur_start; $best_end = $_; } } print qq(Start: $best_start End: $best_end Sum: $best Numbers: @array[$best_start..$best_end] );