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]);
}
}