E.Two Matchings
这里直接放一位大佬的题解吧
本题所得
当一个数列在计算的时候,出现了多种状态的时候,不能只顾头尾不管中间,这时候需要用的dp去慢慢的选择每一步中最优的状态!
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mx =200020;
ll dp[mx];
ll a[mx];
ll he6(int x){
return a[x]+a[x-1]+a[x-3]-a[x-2]-a[x-4]-a[x-5];
}
ll he4(int x){
return a[x]+a[x-1]-a[x-2]-a[x-3];
}
int main() {
ios::sync_with_stdio(0);
int t,n,m,x,y;
cin>>t;
while(t--){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+1+n);
ll ans=0;
for(int i=2;i<=n;i+=2){
ans+=a[i]-a[i-1];
}
dp[4]=a[3]-a[1]+a[4]-a[2];
dp[6]=a[3]+a[5]+a[6]-a[1]-a[2]-a[4];
dp[8]=dp[4]+a[8]+a[7]-a[5]-a[6];
for(int i=10;i<=n;i+=2){
ll x=dp[i-4]+he4(i);
ll y=dp[i-6]+he6(i);
dp[i]=min(x,y);
}
cout<<ans+dp[n]<<"\n";
}
return 0;
}