ZJU 1196 Fast Food

http://acm.zju.edu.cn/show_problem.php?pid=1013

2688316 2007-11-28 21:08:28 Accepted 1196 C++ 00:00.01 576K arena
/*
动态规划:
用剪切粘帖法证明最优子结构: 设f[i][j]是前i个shop里放置了j个depot的最小sum。则:
f[i][j]=min{ f[i-k][j-1]+c[i-k+1,i];   c[i][j]代表从i到j中放置一个depot时的最小sum
*/
#include <stdio.h>
#include <string.h>
int a[201], f[201][31], c[201][201];

// 用函数递推地初始化cost费用数组c,比写一个cost(i,j)然后每次调用节省了很多重复计算。时间从0.15缩短至0.00
void cost( int n) {
int i, j, k;
for(i = 1; i < n; i ++) {
   for(k = i+1; k <= n; k ++) {
    int mid = (i + k) / 2;
    for(j = i; j <mid; j ++)
     c[i][k] +=a[mid] -a[j];
    for( j=mid+1; j<=k; j++)
     c[i][k] +=a[j]-a[mid];
   }
}
}

int main() {
int num=0;
// freopen("D://in.txt", "r", stdin);
int s, d, i, j, k, temp;
while( scanf("%d %d", &s, &d)!=EOF && s!=0 && d!=0 ) {
   memset(c, 0, sizeof(c));
   memset( f, 9999999, sizeof(f));
   for( i=1; i<=s; i++) {
    scanf("%d", &a[i]);
    if( i<=d)
     f[i][i]=0;
   }
   cost(s);
   //刚开始就是没有初始化f[i][1],搞得我wa 6次,郁闷... 以后一定要先推一些,看看那些状态是不能从dp方程推导出的,就一定要初始化
   for( i=1; i<=s; i++)
    f[i][1]=c[1][i];

   for( i=1; i<=s; i++) {
    for( j=2; j<=d && j<=i; j++) {
     for( k=1; k<=i+1-j; k++) {
      temp=f[i-k][j-1]+c[i-k+1][i]; // dp
      if( f[i][j]> temp)
       f[i][j]=temp;
     }
    }
   }
   printf("Chain %d/nTotal distance sum = %d/n/n", ++num, f[s][d]);
}
return 0;
}

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值