hdu 1227 fast food

思路:

depots[i][j] 表示i个供应站j个饭馆的最优值

cost[i][j] 表示 从i到j建立一个供应站后的耗费(可以得知供应站必定建在中位数处:下标为(i+j)/2)

状态方程:

depots[i][j] = MIN(depots[i][j],depots[i-1][m]+cost[m+1][j])

在m处建立i-1个供应站,在m到j处建立一个供应站,找出最小值

这边m的范围要注意 i-1<=m<j 建立一个供应站先确定depots的初始条件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

#include <stdlib.h>
#include <string.h>
#include <math.h>
#define inf 0x7fffffff
#define MIN(x,y) (x)<(y)?(x):(y)
int distance[220];
int depots[35][220];
int cost[220][220];
int ()
{
int n,k,m,p;
int i,j;
int cases = 1;
freopen("Sample Input.txt","r",stdin);
while ( scanf("%d%d",&n,&k),n||k)
{
for ( i = 1; i <= n; i++)
scanf("%d",&distance[i]);
for ( i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
cost[i][j] = 0;
for ( p = i; p <= j; p++)
cost[i][j] += abs(distance[p] - distance[(i+j)/2]);
}
}
for ( i = 1; i <= n; i++)
depots[1][i] = cost[1][i];
for ( i = 2; i <= k; i++)
{
for (j = i + 1; j <= n; j++)
{
depots[i][j] = inf;
for ( m = i - 1; m < j; m++)
depots[i][j] = MIN(depots[i][j],depots[i-1][m] + cost[m+1][j]);
}
}
printf("Chain %dn",cases++);
printf("Total distance sum = %dnn",depots[k][n]);
}
return 0;
}