题目链接:Making the Grade
一条直立的土路连接着FJ农场的两个田地,但它改变的海拔比FJ希望的要高。他的奶牛不介意爬上或爬下一个斜坡,但他们不喜欢山丘和山谷交替的继承。FJ希望添加和清除道路上的污垢,使其成为一个单调的斜坡(向上或向下倾斜)。
你得到N整数A1,。。。,A N(1≤N≤2000)描述高程(0≤A i≤1,000,000),在沿路的每个N相距均等的位置,从第一个领域开始,到另一个结束。 FJ希望将这些高程调整为新的B1序列。, BN,要么不增加, 要么不增加。由于在沿路任何位置添加或清除污垢的成本相同,因此修改道路的总成本是
|A1 - B1|+ |A2 - B2|+ … + |N - BN |
请计算他的道路分级的最小成本,使其成为一个连续的斜坡。FJ高兴地告诉你,签名的32位整数当然可以用来计算答案。
输入
* 第 1 行: 单个整数: N
* 行 2.N+1: I线 +1 包含单个整数高程: ai
输出
* 第 1 行: 单个整数, 这是 Fj 对土路进行分级的最低成本, 因此它在海拔上变得不增加或不增加。
示例输入
7
1
3
2
4
5
3
9
样品输出
3
题解1
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
const int maxn=5e3+5;
int a[maxn],b[maxn];
int dp[maxn][maxn];
int inf=0x3f3f3f3f;
int main()
{
int n;
scanf("%d",&n);
int i,j;
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(b+1,b+n+1);
int sum=0;
for(i=1;i<=n;i++)
dp[1][i]=fabs(a[1]-b[i]);
int q=inf;
for(i=2;i<=n;i++)
{
int mx=inf;
for(j=1;j<=n;j++)
{
mx=min(mx,dp[i-1][j]);
//printf("%d\n",dp[i-1][j]);
int p=fabs(a[i]-b[j]);
dp[i][j]=mx+p;
//printf("%d**\n",dp[i][j]);
}
}
for(i=1;i<=n;i++)
q=min(q,dp[n][i]);
printf("%d\n",q);
//printf("%d\n",q);
}
题解二
#include<stdio.h>
#include<queue>
#include<algorithm>
using namespace std;
int main()
{
int n,a,k;
priority_queue<int>q;
scanf("%d",&n);
k=0;
while(n--)
{
scanf("%d",&a);
q.push(a);
if(q.top()>a)
{
k+=q.top()-a;
q.pop();
q.push(a);
}
}
printf("%d\n",k);
}