解题思路
此处撰写解题思路
我这里遇到的问题:
1、这个DP的转移方程很难写出来,不好想到建立二维数组是为了标记这个点交换和不交换两种状态
2、动态规划这种三种情况,自己要想到。就是没有想到A[i],B[i]不交换,则前面要不要交换
3、这里,数组的初始化,如果一个数组里面有5个元素,则数组A[5]。
代码
int minSwap(int A, int ASize, int B, int BSize)
{
int i;
int dp[ASize][ASize];
//初始化;表示第一个元素交换和不交换
dp[0][0] = 0;
dp[0][1] = 1;
for (int i = 1; i < ASize; i++)
{
if (A[i - 1] < A[i] && B[i - 1] < B[i])
{
if (A[i - 1] < B[i] && B[i - 1] < A[i]) //可交换,可不交换
{
dp[i][0] = fmin(dp[i - 1][0], dp[i - 1][1]);
dp[i][1] = fmin(dp[i - 1][0], dp[i - 1][1]) + 1;
}
else //不能交换
{
dp[i][0] = dp[i - 1][0];
dp[i][1] = dp[i - 1][1] + 1;
}
}
else //必须交换
{
dp[i][0] = dp[i - 1][1];
dp[i][1] = dp[i - 1][0] + 1;
}
}
return fmin(dp[ASize - 1][0], dp[ASize - 1][1]);
}