在n个商店中建m个仓库,使各个商店到仓库的路程之和最小,商店到哪个仓库是有选择的,
总之路程之和要最小!
#include <iostream>
#include <stdio.h>#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <cmath>
#define N 300
using namespace std;
int dis[N];
int cost[N][N];
int dp[N][N];
/**
cost[i][j] 表示从第i个饭店到j个饭店之间设置一个仓库所增加的距离
dp[i][j]表示前j个饭店设置i个仓库所得的最短距离
状态转移方程
dp[i][j] = min(dp[i][j], dp[i-1][m]+cost[m+1][j]);
意思就是前m个饭店建立i-1仓库,剩下的饭店共建立1个仓库,共建立i个仓库
*/
int main()
{
int n,k;
int ca = 0;
while(~scanf("%d%d", &n, &k))
{
if(n == 0 && k == 0) break;
for(int i = 1;i <= n;i++)
{
scanf("%d", &dis[i]);
}
for(int i = 1;i <= n;i++)
{
for(int j = i;j <= n;j++)
{
cost[i][j] = 0;
for(int m = i; m <= j;m++)
{
cost[i][j] += abs(dis[m] - dis[(i+j)/2]);
}
}
}
for(int i = 1;i <= n;i++)
{
dp[1][i] = cost[1][i];
}
for(int i = 2;i <= n;i++)
{
for(int j = i;j <= n;j++)
{
dp[i][j] = 0xffffff;
for(int m = i-1;m <= j-1;m++)
{
dp[i][j] = min(dp[i][j], dp[i-1][m]+cost[m+1][j]);
}
}
}
printf("Chain %d\n", ++ca);
printf("Total distance sum = %d\n\n", dp[k][n]);
}
return 0;
}