hdu 1227 Fast Food

http://acm.hdu.edu.cn/showproblem.php?pid=1227

在n个商店中建m个仓库,使各个商店到仓库的路程之和最小,商店到哪个仓库是有选择的,求路程之和最小。

dp[i][j]为建i个仓库前j个商店。

 1 #include <cstdio>

 2 #include <cstring>

 3 #include <algorithm>

 4 #define maxn 1000

 5 using namespace std;

 6 const int inf=1<<29;

 7 

 8 int dp[40][maxn];

 9 int d[maxn];

10 int dis[maxn][maxn];

11 int n,k;

12 

13 int main()

14 {

15     int cas=0;

16     while(scanf("%d%d",&n,&k)!=EOF)

17     {

18         if(n==0&&k==0) break;

19         memset(dis,0,sizeof(dis));

20         for(int i=1; i<=n; i++)

21         {

22            scanf("%d",&d[i]);

23         }

24         for(int i=1; i<=k; i++)

25         {

26             for(int j=i; j<=n; j++)

27             {

28                 dp[i][j]=inf;

29             }

30         }

31         for(int i=1; i<=n; i++)

32         {

33             for(int j=i; j<=n; j++)

34             {

35                 for(int c=i; c<=j; c++)

36                 dis[i][j]+=abs(d[c]-d[(i+j)/2]);

37             }

38             dp[1][i]=dis[1][i];

39         }

40         for(int i=2; i<=k; i++)

41         {

42             for(int j=i; j<=n; j++)

43             {

44                 for(int c=i-1; c<=j-1; c++)

45                 {

46                     dp[i][j]=min(dp[i][j],dp[i-1][c]+dis[c+1][j]);

47                 }

48             }

49         }

50         printf("Chain %d\n",++cas);

51         printf("Total distance sum = %d\n\n",dp[k][n]);

52     }

53     return 0;

54 }
View Code

 

你可能感兴趣的:(HDU)