public long findAnswer() {
		long answer = Long.MAX_VALUE;

		long[][] orig = getBigSquare();
		long[][] curr = getBigSquare();

		int size = orig.length;
		for (int col = 0; col < size - 1; ++col) {
			boolean improved = true;
			while (improved == true) {
				improved = false;
				int row = 0;
				long nextRowSum = curr[row + 1][col] + curr[row + 1][col + 1];
				long prevRowSum = 0;

				if (nextRowSum < curr[row][col]) {
					improved = true;
					curr[row][col] = nextRowSum;
				}

				for (row = 1; row < size - 1; ++row) {
					nextRowSum = curr[row + 1][col] + curr[row + 1][col + 1];
					prevRowSum = curr[row - 1][col] + curr[row - 1][col + 1];
					if (nextRowSum < curr[row][col]) {
						improved = true;
						curr[row][col] = nextRowSum;
					}
					if (prevRowSum < curr[row][col]) {
						improved = true;
						curr[row][col] = prevRowSum;
					}
				}
				row = size - 1;
				prevRowSum = curr[row - 1][col] + curr[row - 1][col + 1];
				if (prevRowSum < curr[row][col]) {
					improved = true;
					curr[row][col] = prevRowSum;
				}

			}
			for (int row = 0; row < size; ++row) {
				curr[row][col + 1] += curr[row][col];
			}

		}

		for (int row = 0; row < size; ++row) {
			answer = Math.min(answer, curr[row][size - 1]);
		}
		return answer;
	}