public static int dp(int mask, int cursor, int ant) {

		if (mask == (1 << n) - 1)
			return 0;
		/*if (dp[mask][cursor] > 0)
			return dp[mask][cursor];*/

		int ans = Integer.MAX_VALUE;
		for (int i = 0; i < arr.length; i++) {
			if ((mask & (1 << (n - i - 1))) == 0) {
				int cambio;
				if (cursor < i) {
					int last = 0;
					for (int k = cursor; k < i; k++) {
						if ((mask & 1 << k) > 0)
							last++;
					}

					cambio = last;
				} else {
					int last = 0;
					for (int k = cursor - 1; k >= i; k--) {
						if ((mask & 1 << k) > 0)
							last++;
					}

					cambio = last;
				}

				ans = Math.min(ans, dp(mask | (1 << (n - i - 1)), i + 1, i)
						+ cambio + (cursor - 1 >= 0 ? r[ant][i] : r[0][i]) + 1);
			}
		}

		return dp[mask][cursor] = ans;

	}