Think:
1知识点:dp+sort()快速排序
2状态转移方程
dp[i][j]:i个数以b[j]作为第i个数的当前状态最优解;
dp[i][j] = abs(a[i]-b[j]) + min(dp[i-1][k]) 1<=k<=n;
3思考:可通过滚动数组优化
以下为Accepted代码
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int inf = 0x3f3f3f3f;
const int N = 2014;
int a[N], b[N], dp[N][N];
/*dp[i][j]:i个数以b[j]作为第i个数的当前最优解*/
void solve(int n);
int main(){
int n, i;
while(~scanf("%d", &n)){
for(i = 1; i <= n; i++){
scanf("%d", &a[i]);
b[i] = a[i];
}
solve(n);
}
return 0;
}
void solve(int n){
sort(b+1, b+1+n);
memset(dp, 0, sizeof(dp));
for(int i = 1; i <= n; i++){
int miv = dp[i-1][1];
for(int j = 1; j <= n; j++){
miv = min(miv, dp[i-1][j]);
dp[i][j] = miv + abs(a[i]-b[j]);
}
}
int ans = inf;
for(int i = 1; i <= n; i++)
ans = min(ans, dp[n][i]);
printf("%d\n", ans);
}