hdu1227 n个站点建m个餐厅使(每个站点到他最近的餐厅)和最小
前i个站点建j个餐厅=
min(前k个站点建j-1个餐厅+最后一个餐厅必然建在a[(k+1+i)/2]的位置) (j-1<=k<i)
1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 #include<math.h> 5 using namespace std; 6 int dp[205][35],cost[205][205],a[205]; 7 int main() 8 { 9 int i,j,m,n,k,temp,mid,minx,t=0; 10 while (~scanf("%d%d",&n,&m)&&n&&m) 11 { 12 for (i=1;i<=n;i++) 13 scanf("%d",&a[i]); 14 for (i=1;i<=n;i++) 15 for (j=i;j<=n;j++) 16 { 17 mid=a[(i+j)/2]; temp=0; 18 for (k=i;k<=j;k++) 19 temp+=abs(a[k]-mid); 20 cost[i][j]=temp; 21 } 22 memset(dp,0,sizeof(dp)); 23 for (i=1;i<=n;i++) 24 dp[i][1]=cost[1][i]; 25 for (i=1;i<=n;i++) 26 for (j=2;j<=i&&j<=m;j++) 27 { 28 minx=0x3f3f3f3f; 29 for (k=j-1;k<i;k++) 30 minx=min(minx,dp[k][j-1]+cost[k+1][i]); 31 dp[i][j]=minx; 32 } 33 printf("Chain %d\n",++t); 34 printf("Total distance sum = %d\n\n",dp[n][m]); 35 } 36 }