离散化b[n]
a[i][j]=abs(a[i]-b[i])+min(a[i-1][k]) (k<=j)
其中min(a[i-1][k]),在第2层循环中其实可以算(mn表示)
下面是动态规划的图:
a[n] | b[n] | |||||||
1 | 1 | 0 | 1 | 2 | 2 | 3 | 4 | 8 |
3 | 2 | 2 | 1 | 0 | 0 | 1 | 2 | 6 |
2 | 3 | 3 | 1 | 1 | 1 | 2 | 3 | 7 |
4 | 3 | 6 | 3 | 2 | 2 | 1 | 2 | 6 |
5 | 4 | 10 | 6 | 4 | 4 | 2 | 1 | 5 |
3 | 5 | 12 | 7 | 4 | 4 | 3 | 3 | 7 |
9 | 9 | 20 | 14 | 10 | 10 | 8 | 7 | 3 |
#include<stdio.h>
#include<math.h>
#define N 2010
int dp[N][N];
int a[N],b[N];
void qsort(int l,int r)
{
int i,j,x;
if(l<r)
{
i=l;
j=r;
x=b[l];
while(i<j)
{
while(i<j&&b[j]>=x)
j--;
if(i<j)
b[i++]=b[j];
while(i<j&&b[i]<x)
i++;
if(i<j)
b[j--]=b[i];
}
b[i]=x;
qsort(l,i-1);
qsort(i+1,r);
}
return ;
}
int min(int x,int y)
{
return x>y?y:x;
}
int main(void)
{
int n,i,j,mn,ans;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",a+i);
b[i]=a[i];
}
qsort(0,n);
for(i=1;i<=n;i++)
{
mn=dp[i-1][1];
for(j=1;j<=n;j++)
{
mn=min(mn,dp[i-1][j]);
dp[i][j]=abs(a[i]-b[j])+mn;
}
}
ans=dp[n][1];
for(i=2;i<=n;i++)
ans=min(ans,dp[n][i]);
printf("%d\n",ans);
}