题目链接: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 ",Case++); 44 printf("Total distance sum = %d ",dp[n][k]); 45 } 46 return 0; 47 }