HDU 1227 Fast Food DP

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1227

题目大意:给定x轴上n个车站的位置和k个饭店。求k个饭店供给n个车站的距离总和的最小值。

题目解析:动态规划题,用dp[i][j]表示由j个饭店供给i个饭店的最小值,cost[i][j]表示由一个饭店供给从i到j的饭店的最小值,饭店的位置选在(mid=(i+j)/2)的位置的车站时cost值最小。

状态转移方程:dp[i][j]=min(dp[l-1][j-1]+cost[l][i]) (j≤ l≤i)

 1 #include<cmath>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 using namespace std;
 7 #define INF 9999999
 8 int dp[205][32],n,k,cost[202][202],a[201];
 9 //dp[i][j]表示前i个车站用j个饭店的最小值
10 //cost[i][j]表示从i到j用一个饭店的值
11 int main()
12 {
13     int i,j,mid,Case=1;
14     while(scanf("%d%d",&n,&k),n+k)
15     {
16         for(i=1;i<=n;i++)
17             scanf("%d",&a[i]);//每个车站的位置
18         for(i=1;i<=n;i++)
19             for(j=i;j<=n;j++)
20         {
21             cost[i][j]=0;
22             mid=(i+j)/2;
23             for(int l=i;l<=j;l++)
24             {
25                 cost[i][j]+=(int)abs(a[mid]-a[l]);
26             }
27         }
28         memset(dp,0,sizeof(dp));
29         for(i=1;i<=n;i++)
30             dp[i][1]=cost[1][i];//初始化
31         for(i=2;i<=n;i++)
32             for(j=2;j<=k;j++)
33             // i为车站,j为饭店
34         {
35             int _min=INF;
36             for(int l=j;l<=i;l++)
37             {
38                 if(_min>(dp[l-1][j-1]+cost[l][i]))
39                     _min=dp[l-1][j-1]+cost[l][i];
40             }
41             dp[i][j]=_min;
42         }
43         printf("Chain %d\n",Case++);
44         printf("Total distance sum = %d\n\n",dp[n][k]);
45     }
46     return 0;
47 }
View Code

 

posted @ 2013-12-07 23:00  飞火扑蛾  阅读(234)  评论(0编辑  收藏  举报