for (int xStart=1; xStart<width[low]-xWidth; xWidth++) {
for (int xStart=1; xStart<width[low]-xWidth; xStart++) {
    private void initCaches() {	for (int i1=0; i1<A.length; i1++) {	    for (int i2=0; i2<A[0].length; i2++) {		for (int i3=0; i3<A[0][0].length; i3++) {		    for (int i4=0; i4<A[0][0][0].length; i4++) {			for (int i5=0; i5<A[0][0][0][0].length; i5++) {			    A[i1][i2][i3][i4][i5] = -1;			}		    }		}	    }	}	// now find maximal uniform regions with the same width, and alias their memoization tables	int low=0;	while (low<uniform.length) {	    while (low<uniform.length && !uniform[low]) {		low++;	    }	    if (low<uniform.length) {		int high = low;		while (high+1<uniform.length && uniform[high+1] && (width[high+1]==width[low])) {		    high++;		}		// alias low..high across the board, to point to values in 0'th column		for (int i1=low; i1<=high; i1++) {		    // only aliasing from i2=i1..high matters, but we'd just as well go i2=low...high		    for (int i2=low; i2<=high; i2++) {			for (int xWidth=0; xWidth<width[low]-1; xWidth++) {			    for (int xStart=1; xStart<width[low]-xWidth; xWidth++) {				A[xStart][xStart+xWidth][i1][i2] = A[0][xWidth][i1][i2];				strCache[xStart][xStart+xWidth][i1][i2] = strCache[xStart][xStart+xWidth][i1][i2];			    }			}		    }		}	    }	    low++;	}    }