dp+离散化
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#define Maxsize 500
#define inf 0x3f3f3f3f
int dp[Maxsize][Maxsize][2];
int n;
int a[Maxsize];
int b[Maxsize];
struct Node{
int id,val;
}v[Maxsize];
int cmp(const void *a,const void *b)
{
Node *c=(Node *)a;
Node *d=(Node *)b;
return c->val-d->val;
}
int abs(int x)
{
if(x>0)
return x;
else return -x;
}
int findmin(int a,int b)
{
return a>b?b:a;
}
int main()
{
int t;
int i,j,k;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&v[i].val);
v[i].id=i;
}
qsort(v,n,sizeof(v[0]),cmp);
int count=0;
a[v[0].id]=++count;
b[count]=v[0].val;
for(i=1;i<n;i++)
{
if(v[i].val==v[i-1].val)
a[v[i].id]=count;
else a[v[i].id]=++count;
b[count]=v[i].val;
}
/* for(i=0;i<n;i++)
{
printf("%d ",a[i]);
}
printf("\n");
for(i=1;i<=count;i++)
{
printf("%d ",b[i]);
}
printf("\n");*/
memset(dp,0x3f,sizeof(dp));
for(i=1;i<=count;i++)
dp[0][i][0]=dp[0][i][1]=abs(b[a[0]]-b[i]);
for(k=1;k<n;k++)
for(i=1;i<=count;i++)
{
for(j=1;j<=i;j++)
{
dp[k][i][0]=findmin(dp[k][i][0],dp[k-1][j][0]);
}
dp[k][i][0]+=abs(b[a[k]]-b[i]);
for(j=i;j<=count;j++)
{
dp[k][i][1]=findmin(dp[k][i][1],dp[k-1][j][1]);
}
dp[k][i][1]+=abs(b[a[k]]-b[i]);
}
/* for(i=0;i<n;i++)
{
for(j=1;j<=count;j++)
printf("%5d ",dp[i][j][0]);
printf("\n");
}
for(i=0;i<n;i++)
{
for(j=1;j<=count;j++)
printf("%5d ",dp[i][j][1]);
printf("\n");
}*/
int ans=inf;
for(i=1;i<=count;i++)
{
ans=findmin(dp[n-1][i][0],ans);
ans=findmin(dp[n-1][i][1],ans);
}
printf("%d\n",ans);
}
return 0;
}