public void execute() {
		// Initialize the matrix.
		int firstSize, secondSize;
		firstSize = s1.size();
		secondSize = s2.size();
		
		// Let's see if we're just being silly...
		if (firstSize < 2 || secondSize < 2) {
			throw new IllegalArgumentException("Oh come on, do you really need a computer to align those sequences...?");
		}
		
		// We'll use multiple matrices, because it's easier to debug our work
		// if we don't throw away data.  A simple optimization would be to
		// just use one matrix.
		matrix = new int[firstSize][secondSize];
		finalScores = new int[firstSize][secondSize];
		traceback = new int[firstSize][secondSize];
		// Fill with comparison values.
		for (int i=0; i < firstSize; i++) {
			for (int j=0; j < secondSize; j++) {
				matrix[i][j] = comparator.compare((Monomer)s1.get(i),(Monomer)s2.get(j));
			}
		}
		// We've already got something interesting, and printing it out would let us
		// eyeball the final solution.  Now for the actual dynamic programming.

		// Uncomment one of the following to dump a matrix to stdout, for debugging.
		System.out.println("Original matrix:"); dumpMatrix(matrix);
		
		// The edges are pretty easy.
		for (int i=0; i < matrix.length; i++) {
			finalScores[i][0] = matrix[i][0] - gapPenalty(i);
		}
		for (int j=1; j < matrix[0].length; j++) {
			finalScores[0][j] = matrix[0][j] - gapPenalty(j);
		}
		// Now do the math for the interior spaces.
		for (int i=1; i < matrix.length; i++) {
			for (int j=1; j < matrix[0].length; j++) {
				int thisScore = calculateScoreAt(i,j);
				finalScores[i][j] = thisScore;
			}
		}
		// The penalties at the other end are handled by the doTracebackAt method.

		// Uncomment the following if you want more debugging.
		System.out.println("Final scores (except along lower/right edges):"); dumpMatrix(finalScores);
		// Now, do the traceback and find the best score.
		// There will always be at least one alignment.
		numberOfAlignments = 1;
		// If a traceback turns up a branch, it'll increase the number of alignments.
		score = doTracebackAt(29,29);
		
		// Uncomment this to see the traceback matrix.
		//dumpMatrix(traceback);
	}