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;
}
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;
}
相关文章推荐
- zoj 1196 Fast Food
- 题目1196:成绩排序
- 杭电水题--1196 Lowest Bit (bitset:to_string有关问题)
- zju-会员分组
- zju 2587 判断最小割是否唯一
- zju(1)嵌入式开发环境构建
- hdu-1196-Lowest Bit
- zju1095
- ZJU 1990 Subway tree systems - 树的最小表示
- HDU 1196
- zju pat 1036
- ZJU 3201 树形DP
- ZJU 3686 线段树
- EASY_PAT_ZJU_ADVANCED LEVEL_1011 尽量用Vector代替Array,这样会方便很多
- ZJU PAT 1015 德才论
- 九度oj 题目1031:xxx定律 【ZJU2009考研机试题1】
- 九度oj 题目1008:最短路径问题 【ZJU2010考研机试题4】【dij+dfs】
- 九度oj 题目1468:Sharing 【ZJU2012考研机试题2】
- ZJU PAT 1020 月饼
- ZJU-PAT 1078. Hashing (25) 浙大2014年上机复试第二题