随笔-65  评论-6  文章-0  trackbacks-0
 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)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理