#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
#define maxn 3000
#define ll long long
ll dp[maxn][maxn];
int a[maxn],b[maxn],n;
void solve()
{
ll minn;
for(int i=1;i<=n;i++)
{
minn=dp[i-1][1];
for(int j=1;j<=n;j++)
{
minn=min(minn,dp[i-1][j]);
dp[i][j]=abs(a[i]-b[j])+minn;
}
}
ll ans=dp[n][1];
for(int i=1;i<=n;i++)
ans=min(ans,dp[n][i]);
printf("%lld\n",ans);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(b+1,b+1+n);
solve();
return 0;
}
POJ3666 Making the Grade [DP,离散化]
最新推荐文章于 2022-05-09 16:57:25 发布
本文介绍了一个使用 C++ 实现的最小化匹配问题解决方案。通过动态规划的方法来寻找两个序列间的最佳匹配,以达到总成本最小化的目的。代码中详细展示了如何初始化数据结构、更新状态转移方程及最终输出最优解。

765

被折叠的 条评论
为什么被折叠?



