662 - Fast Food
2011-07-24 13:37
344 查看
做这道题时没有什么想法,后来在《使用算法分析与程序设计》上看到了这道题,除了输出完全一样。看了以后,觉得自己好好想想也应该能做出来的,思维还是不够开阔。
设w[i][j]表示从i到j只放一个depots的最小距离,w[i][j] = ∑|d[l] - d[(i + j) / 2]| (i <= l <= j)。设状态m[i][j]表示前j个饭店放i个depots的最小距离和,则m[k]
即为问题的解。
边界条件:m[1][j] = w[1][j] (1 <= j <= n);状态转移方程:m[i][j] = min(m[i - 1][l] + w[l + 1][j]) (i - 1 <= l <= j - 1),时间复杂度为O(k*n2)。
最后递归输出即可,做的时候输出上浪费了很多时间。
设w[i][j]表示从i到j只放一个depots的最小距离,w[i][j] = ∑|d[l] - d[(i + j) / 2]| (i <= l <= j)。设状态m[i][j]表示前j个饭店放i个depots的最小距离和,则m[k]
即为问题的解。
边界条件:m[1][j] = w[1][j] (1 <= j <= n);状态转移方程:m[i][j] = min(m[i - 1][l] + w[l + 1][j]) (i - 1 <= l <= j - 1),时间复杂度为O(k*n2)。
最后递归输出即可,做的时候输出上浪费了很多时间。
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace std; const int INF = (1<<29); int d[205], w[205][205], m[35][205], v[205][205]; void print_ans(int i, int j, int sum, int cur) { if(cur == 0) return ; for(int loop = i - 1; loop < j; loop++){ if(m[i - 1][loop] + w[loop + 1][j] == sum){ print_ans(i - 1, loop, sum - w[loop + 1][j], cur - 1); if(loop + 1 == j) printf("Depot %d at restaurant %d serves restaurant %d\n", cur, (j + loop + 1) / 2, j); else printf("Depot %d at restaurant %d serves restaurants %d to %d\n", cur, (j + loop + 1) / 2, loop + 1, j); break; } } } int main() { //freopen("input.txt", "r", stdin); int n, k; int con = 1; while(scanf("%d %d", &n, &k) == 2){ if(!n && !k) break; for(int i = 1; i <= n; i++) scanf("%d", &d[i]); memset(w, 0, sizeof(w)); for(int i = 1; i <= n; i++){ for(int j = i + 1; j <= n; j++){ int sum = 0; for(int loop = i; loop <= j; loop++) sum += (int)fabs((d[loop] - d[(j + i) / 2])); w[i][j] = w[j][i] = sum; } } for(int j = 1; j <= n; j++) m[1][j] = w[1][j]; for(int i = 2; i <= k; i++){ for(int j = i; j <= n; j++){ m[i][j] = INF; int x; for(int loop = i - 1; loop <= j - 1; loop++){ m[i][j] = min(m[i][j], m[i - 1][loop] + w[loop + 1][j]); } } } printf("Chain %d\n", con++); print_ans(k, n, m[k] , k); printf("Total distance sum = %d\n\n", m[k] ); } return 0; }
相关文章推荐
- 小白dp uva 662 - Fast Food (除夕夜的博客 ^ ^)
- UVA 662 Fast Food(DP)
- UVA - 662 Fast Food
- uva 662 Fast Food
- UVA 662 Fast Food
- UVA 662 Fast Food(dp)
- 662 - Fast Food
- UVa 662 - Fast Food
- dp( UVa 662 Fast Food )
- UVA662- Fast Food
- uva 662 Fast Food (dp)
- UVA - 662 Fast Food 区间DP
- uva 662 - Fast Food(dp)
- UVA 662 Fast Food(dp)
- Fast Food - UVa 662 dp
- 662 - Fast Food
- uva_662 - Fast Food( 区间DP )
- uva 662 - Fast Food
- DP(递归打印路径) UVA 662 Fast Food
- hdu 1227 fast food 动态规划