cost 记录两个车站之间只有一个仓库时的最小距离。
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
using namespace std;
int save[500],n,k;
int dp[500][500];
int cost[500][500];
int main()
{
int cases=1;
while(~scanf("%d%d",&n,&k))
{
if(n+k==0)
break;
for(int i=1;i<=n;i++)
{
scanf("%d",&save[i]);
}
sort(save+1,save+1+n);
memset(dp,0,sizeof(dp));
memset(cost,0,sizeof(cost));
int mid;
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++)
{
cost[i][j]=0;
mid=(i+j)/2;
for(int l=i;l<=j;l++)
{
cost[i][j]+=abs(save[mid]-save[l]);
}
}
for(int i=1;i<=n;i++)
{
dp[i][1]=cost[1][i];
}
for(int i=2;i<=n;i++)
{
for(int j=2;j<=k;j++)
{
int minn=0x3f3f3f3f;
for(int t=j;t<=i;t++)
{
minn=min(minn,dp[t-1][j-1]+cost[t][i]);
}
dp[i][j]=minn;
}
}
printf("Chain %d\n",cases++);
printf("Total distance sum = %d\n\n",dp[n][k]);
}
return 0;
}