dp 思路,
有一排商店,每个商店卖一个编号为 1-n 之间的蛋糕,有 2*n个商店,我们现在有两个人想要买蛋糕,使得蛋糕编号为 1-n递增序列,商店之间距离为1, 起始两个人都从 1 开始,求最小走的距离,。
直接dp, 蛋糕只有两个, 我们设 id[ i ] [ 0 ] / id [ i ] [ 1 ] 为卖 i 号蛋糕的两个商店位置,
dp[ i ] [ 0 ] 可以由 dp [ i-1 ] [ 0 ] 和 dp[ i-1 ] [ 1 ] 推出,选择最小的,一旦 0 选择 下一个 走向 1, 那么 1 要走向 0, 0 要继续走 0 ,1则要走 1。。。。。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
#define ll long long int
ll dp[maxn][2];
ll id[maxn][2];
int main()
{
int n;cin>>n;
for(int i=1;i<=2*n;i++)
{
ll x; cin>>x;
if(id[x][0])id[x][1]=i;
else id[x][0]=i;
}
id[0][0] = id[0][1] = 1;
for(int i=1;i<=n;i++)
{
dp[i][0]=min(dp[i-1][0]+abs(id[i][0]-id[i-1][0])+abs(id[i][1]-id[i-1][1]),
dp[i-1][1]+abs(id[i][1]-id[i-1][0])+abs(id[i][0]-id[i-1][1]));
dp[i][1]=min(dp[i-1][0]+abs(id[i][0]-id[i-1][1])+abs(id[i][1]-id[i-1][0]),
dp[i-1][1]+abs(id[i][1]-id[i-1][1])+abs(id[i][0]-id[i-1][0]));
}
cout << min( dp[n][0], dp[n][1] ) << endl;
return 0;
}