1 //还是转移方程搞懂了就没问题
2 #include <iostream>
3 using namespace std;
4 #define MaxSize 205
5 #define inf 0x7ffffff
6 int f[MaxSize],dp[33][MaxSize],cost[MaxSize][MaxSize] ;
7 //餐馆位置、前j个餐馆设立i个仓库的最短距离、第i个餐馆到第j个餐馆的设立一个仓库的最短距离
8 inline int abs(int a){
9 if(a<0) a=-a;
10 return a;
11 }
12 inline int min(int a,int b){
13 return a<b?a:b;
14 }
15 int main(){
16 //freopen("in.txt","r",stdin);
17 int i,j,w,n,k,no=0;
18 while (scanf("%d %d",&n,&k),(n||k)){
19 for(i=1;i<=n;i++)
20 scanf("%d",&f[i]);
21 for(i=1;i<=n;i++)
22 for(j=i;j<=n;j++){
23 int pos=(i+j)>>1,temp1=0;
24 for(w=i;w<=j;w++)
25 temp1+=abs(f[w]-f[pos]);
26 if(pos&1){
27 int temp2=0;
28 for(w=i;w<=j;w++)
29 temp2+=abs(f[w]-f[pos+1]);
30 cost[i][j]=min(temp1,temp2);
31 }
32 else
33 cost[i][j]=temp1;
34 }
35 memset(dp,0,sizeof(dp));
36 for(i=1;i<=n;i++)
37 dp[1][i]=cost[1][i];
38 for(i=2;i<=k;i++)
39 for(j=i;j<=n;j++){
40 dp[i][j]=inf;
41 for(w=i-1;w<j;w++)
42 dp[i][j]=min(dp[i][j],dp[i-1][w]+cost[w+1][j]);
43 }
44
45 printf("Chain %d\n",++no);
46 printf("Total distance sum = %d\n\n",dp[k][n]);
47 }
48 return 0;
49 }
posted on 2012-07-11 11:10
Leo.W 阅读(322)
评论(0) 编辑 收藏 引用