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;
}
浙公网安备 33010602011771号