uva 662 (经典DP邮局问题)
来源:互联网 发布:苹果怎么删除软件 编辑:程序博客网 时间:2024/06/05 18:15
题意:
给在一条直线上的n个汉堡店,以及每个汉堡店在x轴上的坐标。
求建m个供应产,使得每个汉堡店到m个供应产的距离和最小。
解析:
经典的邮局dp问题。
首先需要知道到达几个村庄的最小距离和是这几个村庄的坐标中点。
先用一个遍历找出所有i j之间的所有最小距离,然后再dp。
状态转移方程:
dp[ i ] [ j ] = min ( dp[ i ] [ j ] , dp[ i - 1 ] [ k ] + dis[ k + 1 ] [ j ] )
dp[ i ] [ j ] 表示在j个村庄内,建第i个邮局的最小距离。
dp[ i - 1 ] [ k ] + dis[ k + 1 ] [ j ] 表示得的是在 k + 1 到 j 范围内再建一个邮局的总花费。
路径记录下的是k的值,即为下一段邮局管辖范围内的开头村庄坐标值,再知道此段范围末尾的村庄坐标值,就可以算出邮局的地点。
代码:
#include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <queue>#include <map>#define LL long longusing namespace std;const int inf = 0x3f3f3f3f;const int maxn = 200 + 10;const int maxm = 30 + 10;int dp[maxm][maxn];int path[maxn][maxn];int dis[maxn][maxn];int x[maxn];void print_path(int i, int j){ if (i <= 0) return; int u = path[i][j]; print_path(i - 1, u); if (u + 1 == j) printf("Depot %d at restaurant %d serves restaurant %d\n", i, (u + 1 + j) >> 1, u + 1); else printf("Depot %d at restaurant %d serves restaurants %d to %d\n", i, (u + 1 + j) >> 1, u + 1, j);}int main(){#ifdef LOCAL freopen("in.txt", "r", stdin);#endif // LOCAL int n, m; int ca = 1; while (~scanf("%d%d", &n, &m)) { if (n == 0 && m == 0) break; memset(dp, inf, sizeof(dp)); memset(dis, 0, sizeof(dis)); memset(path, 0, sizeof(path)); memset(x, 0, sizeof(x)); for (int i = 1; i <= n; i++) { scanf("%d", &x[i]); } for (int i = 1; i <= n; i++) { for (int j = i; j <= n; j++) { int mi = (i + j) >> 1; for (int k = i; k <= j; k++) dis[i][j] += abs(x[k] - x[mi]); } } // for (int i = 1; i <= n; i++) { dp[1][i] = dis[1][i]; } for (int i = 2; i <= m; i++)//youju { for (int j = 1; j <= n; j++)//cunzhuan { for (int k = 1; k < j; k++) { int t = dp[i - 1][k] + dis[k + 1][j]; if (t < dp[i][j]) { dp[i][j] = t; path[i][j] = k; } } } } printf("Chain %d\n", ca++); print_path(m, n); printf("Total distance sum = %d\n\n", dp[m][n]); } return 0;}
0 0
- uva 662 (经典DP邮局问题)
- 邮局--dp经典问题
- ♥Vijos 1242-邮局问题【经典DP】
- 邮局问题(DP)
- [IOI2000][DP]邮局问题
- POJ 1160:Post Office 邮局经典DP
- DP 【POJ1160】POST OFFICE 邮局问题
- 邮局选址问题(二)
- 【POJ1160】【IOI2000】邮局(区间dp)
- 邮局问题
- uva - 10271 - Chopsticks (dp | 经典)
- UVA 348 经典dp
- uva 116 Unidirectional TSP 单向TSP 问题,经典dP(路径输出注意规划方向)
- HDU2069 & UVA 674 Coin Change(换硬币 dp 入门经典水题,背包问题)
- 邮局选址问题 (第七题)
- poj1160DP(POST OFFICE 邮局问题)
- poj 1160 Post Office(邮局问题)
- 邮局post office(dp优化之四边形不等式)
- Normalized Mutual Information归一化互信息
- 主机无法访问vmware虚拟机WEB服务器解决办法
- 追逐自己的梦想----------辅助制作第二十课:完善自动技能打怪
- 数据库常见用法
- android UI素材(收集整理)
- uva 662 (经典DP邮局问题)
- 运行jar应用程序引用其他jar包的四种方法(java命令)
- (1P)洁万家拖拖乐胶棉头讲堂:什么是胶棉头
- 常见浏览器兼容性问题与解决方案
- 新加坡防长:望印度介入南海 中国应解释南海行动
- 树莓派2 Model B启用SPI和I2C
- Sicily 7148. Magic Traps
- 欢迎使用CSDN-markdown编辑器
- deleted entity passed to persist: [dcms.ebridge.market.entity.Reward#<null>]