转移的时候,就是:

dp[i][j] = min{dp[i - 1][0...j] + ‍abs(A[i] - T[j])},其中A[i]是第i个数的原始值,T[j]是j离散化前的值。

代码:

#include<iostream>
#include<fstream>

using namespace std;

int n;
long long a[2001];
long long b[2001];

int cmp(const void *a,const void *b){
	return *(long long*)a-*(long long*)b;
}

long long dp[2001][2001];

long long abs(long long s){
	if(s<0) return -s;
	return s;
}

void read(){
//	ifstream cin("in.txt");
	long long i,j,k;
	cin>>n;
	for(i=1;i<=n;i++)
		cin>>a[i];
	for(i=1;i<=n;i++)
		b[i]=a[i];
	qsort(b+1,n,sizeof(long long),cmp);
	for(j=1;j<=n;j++)
		dp[1][j]=abs(a[1]-b[j]);

	for(i=2;i<=n;i++)
	{
		k=dp[i-1][1];
		for(j=1;j<=n;j++)
		{
			k=min(dp[i-1][j],k);
			dp[i][j]=k+abs(a[i]-b[j]);
		}
	}
	k=dp[n][n];
	for(i=n;i>=1;i--)
		k=min(k,dp[n][i]);
	cout<<k<<endl;

}

int main(){
	read();
	return 0;
}

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-08-26
  • 2022-12-23
  • 2021-12-06
  • 2022-02-07
  • 2022-12-23
猜你喜欢
  • 2021-06-20
  • 2021-11-25
  • 2022-02-27
  • 2022-01-24
  • 2021-08-05
  • 2022-12-23
  • 2021-08-12
相关资源
相似解决方案