# run backtracking on lcs-matrix
sub backtracking_lcs {
	my $refmatrix=shift;
	my $ref_xlst=shift;
	my $ref_ylst=shift;
	my @lcs;
	my $x=scalar @$ref_xlst -1; 
	my $y=scalar @$ref_ylst -1;
	while ($y>0 && $x>0) {
		my $actual_value=$refmatrix->[$x]->[$y];
		my $actual_x=$x;
		if (
			($refmatrix->[$x-1]->[$y-1] >= $refmatrix->[$x-1]->[$y]) &&
			($refmatrix->[$x-1]->[$y-1] >= $refmatrix->[$x]->[$y-1])
		) { # go left upper
			$x--; $y--;
		} elsif ($refmatrix->[$x-1]->[$y] >= $refmatrix->[$x]->[$y-1]) { # go left
			$x--;
		} else { # go upper
			$y--;
		}
		# check if value is changed, then push to @lcs
		if ($actual_value > $refmatrix->[$x]->[$y]) {
			push @lcs, $actual_x;
		}
	}
	@lcs=reverse @lcs; # reverse because backtracking
	return \@lcs;
}			

# print out lcs matrix
sub print_lcs {
	my $ref_matrix=shift;
	my $ref_xlst=shift;
	my $ref_ylst=shift;	
	print "LCS: '";
	foreach my $i (@{ backtracking_lcs($ref_matrix, $ref_xlst, $ref_ylst) }) {
		print $ref_xlst->[$i];
	}
	print "'\n";
}


