题意:有n个数,然后将之变为非严格递减或者严格递增的序列
这个题比较弱,然后只用非递减 就好了
dp[i][j]:前i个数的序列,最后一个数是第j大的数的最小值
dp[i][j]=min(dp[i-1][k])+abs(a[i]-b[j]);(1<=k<=j);
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn = 2005;
const long long inf= 0x3f3f3f3f;
int a[maxn],b[maxn];
long long dp[maxn][maxn];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(b+1,b+n+1);
for(int i=1;i<=n;i++)
{
long long temp=inf;
for(int j=1;j<=n;j++)
{
temp=min(temp,dp[i-1][j]);
dp[i][j]=temp+abs(b[j]-a[i]);
}
}
long long ans=inf;
for(int i=1;i<=n;i++) ans=min(ans,dp[n][i]);
printf("%lld\n",ans);
return 0;
}