//重点:一定存在一组最优解,使得每个 Bi都是原序列中的某个值。//即 bi是由ai中的元素组成的,但不一定是ai的排列
//dp[i,j] 为dp[i,j]为a[1~i]安排好,最后一个数字是a'[j] 的差的最小值
//dp[i,j] = min{dp[i-1][k](k<j)} +a'[j]-a[i]
const int N=2222;
int n,ans,a[N],b[N],dp[N][N];
void solve()
{
rpp(i,n)
{
int minv=1<<30;
rpp(j,n)
{
minv=min(minv,dp[i-1][j]);
dp[i][j]=minv+abs(b[j]-a[i]);
}
}
rpp(i,n) ans=min(ans,dp[n][i]);
}
signed main()
{
cin>>n;ans=1<<30;
rpp(i,n) cin>>a[i],b[i]=a[i];
sort(b+1,b+1+n);
solve();
reverse(b+1,b+1+n);//倒着来一次
solve();
cout<<ans<<endl;
return 0;
}
AcWing 273. 分级 (推论,DP)
最新推荐文章于 2022-08-20 09:30:00 发布