#! /usr/bin/perl -w use strict; my @numbers = @ARGV ? @ARGV : qw(2 8 4 5); # Scores is a 2-dim array, $scores[$i][$j] is the best score # that you can get given a string of $j numbers starting at # $numbers[$i]. my @scores; for (0..$#numbers) { $scores[$_][1] = $numbers[$_]; } for my $j (2..@numbers) { for my $i (0..(@numbers - $j)) { my $a = $numbers[$i] - $scores[$i+1][$j-1]; my $b = $numbers[$i+$j-1] - $scores[$i][$j-1]; $scores[$i][$j] = ($a > $b) ? $a : $b; } } my $i = 0; my $score = 0; for my $j (reverse 1..$#numbers) { # print "@numbers[$i..($i+$j)]\n"; if ($numbers[$i] - $scores[$i+1][$j] > $numbers[$i+$j] - $scores[$i][$j]) { print "shift $numbers[$i]\n"; $score = $numbers[$i] - $score; $i++; } else { print "pop $numbers[$i+$j]\n"; $score = $numbers[$i+$j] - $score; } } print "shift $numbers[$i]\n\n"; $score = $numbers[$i] - $score; $score *= -1; print "Score: $score\n"; print "Best score: $scores[0][scalar @numbers]\n";