您的位置:首页 > 其它

ZJU 1196 Fast Food

2007-12-01 00:05 288 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: