https://leetcode-cn.com/problems/minimum-swaps-to-make-sequences-increasing/solution/chai-jie-guan-fang-ti-jie-tong-su-yi-dong-by-xxley/
https://leetcode-cn.com/problems/minimum-swaps-to-make-sequences-increasing/solution/dong-tai-gui-hua-jie-shi-liao-yi-xia-zhi-qian-mei-/
https://leetcode-cn.com/problems/minimum-swaps-to-make-sequences-increasing/solution/c-dong-tai-gui-hua-by-bant-2-2/
Java 代码:
import java.util.Arrays;
public class Solution {
public int minSwap(int[] A, int[] B) {
int len = A.length;
int[][] dp = new int[len][2];
// 初始化特别重要
for (int i = 0; i < len; i++) {
Arrays.fill(dp[i], Integer.MAX_VALUE);
}
// dp[i][0]:A 和 B 在区间 [0, i] 严格递增,且在下标 i 位置不发生交换的次数
// dp[i][1]:A 和 B 在区间 [0, i] 严格递增,且在下标 i 位置发生交换的次数
dp[0][0] = 0;
// 1 个元素一定有序,由于一定发送交换,因此初始化为 1
dp[0][1] = 1;
for (int i = 1; i < len; i++) {
// 在下标 i 位置已经有序
if (A[i - 1] < A[i] && B[i - 1] < B[i]) {
// 什么都不用做
dp[i][0] = Math.min(dp[i][0], dp[i - 1][0]);
// 上一步是交换过的,这一步一定是交换的
dp[i][1] = Math.min(dp[i][1], dp[i - 1][1] + 1);
}
// 交错相等的情况下
if (A[i - 1] < B[i] && B[i - 1] < A[i]) {
dp[i][0] = Math.min(dp[i][0], dp[i - 1][1]);
dp[i][1] = Math.min(dp[i][1], dp[i - 1][0] + 1);
}
}
return Math.min(dp[len - 1][0], dp[len - 1][1]);
}
}