public int minSwap(int[] A, int[] B) {
int[][] dp = new int[n][2];
// dp[i][0] means we don't swap at ith position
// dp[i][1] means we swap at ith position
for (int i = 1; i < n; i++) {
// Case 1: In this case we can either swap or stay the same at ith poition
if (A[i - 1] < A[i] && B[i - 1] < B[i] && A[i - 1] < B[i] && B[i - 1] < A[i]) {
dp[i][0] = Math.min(dp[i - 1][0], dp[i - 1][1]);
dp[i][1] = Math.min(dp[i - 1][0], dp[i - 1][1]) + 1;
// Case 2: If we swap at (i - 1)th position, we should swap at ith position
// If we don't sway at (i - 1)th position, we keep the same operation at ith position
else if (A[i - 1] < A[i] && B[i - 1] < B[i]) {
dp[i][1] = dp[i - 1][1] + 1;
// Case 3: If we swap at (i - 1)th position, we don't swap at ith position
// If we don't swap at (i - 1)th position, we swap at ith position
dp[i][1] = dp[i - 1][0] + 1;
return Math.min(dp[n - 1][0], dp[n - 1][1]);