poj 3666

转移的时候,就是:

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;
}

posted on 2011-05-11 10:56  宇宙吾心  阅读(726)  评论(0)    收藏  举报

导航