题目链接:点击打开链接

题意:一条高速公路,有N个村庄,每个村庄均有一个唯一的坐标,选择P个村庄建邮局,问怎么选择,才能使每个村庄到其最近邮局的距离和最小?最后打印这个最小值。

思路:典型的DP问题。

当我们在v个村庄中只建一个邮局,可以推导出,只有邮局位于中间位置,距离和才最小;有一个特殊情况是,当村庄数为偶数,中间位置有两个村庄,经过计算,两个村庄的距离和相等,所以俩位置均可。

可以联想到,N个村庄建P个邮局,相当于每个邮局均有一个作用范围,该邮局位于其作用范围的中间位置,就是要找到一个k,使前k个村庄建P - 1个邮局,最后几个村庄建一个邮局的方案满足题意。

那么,状态转移方程就可以写成:

dp[i][j]:前i个村庄建j个邮局的最小距离和

dis[i][j]:第i个村庄到第j个村庄之间建1个邮局的最小距离和

状态转移方程:dp[i][j] = min(dp[i][j],dp[k][j - 1] + dis[k + 1][j])

还有一点,计算dis[i][j]时,dis[i][j - 1]已经计算出来,而且可以推导出无论j - 1为奇数还是偶数,dis[i][j]均可以写成dis[i][j - 1] + j距离i、j中点的距离。

// POJ 1160 Post Office 运行/限制:32ms/1000ms
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
#define INF 0X3f3f3f3f
int N, P;
int a[305];//村庄位置
int dis[305][305];//dis[i][j]表示i,j之间建一个邮局的最小距离和
int dp[305][35];//dp[i][j]表示前i个村庄建j个邮局的最小距离和
int main(){while (scanf("%d%d", &N, &P) != EOF) {for (int i = 1; i <= N; i++) {scanf("%d", &a[i]);}memset(dis, 0, sizeof(dis));for (int i = 1; i <= N - 1; i++) {for (int j = i + 1; j <= N; j++) {dis[i][j] = dis[i][j - 1] + a[j] - a[(i + j) / 2];}}memset(dp, INF, sizeof(dp));for (int i = 1; i <= N; i++) {dp[i][1] = dis[1][i];//建一个邮局的情况是临界值,事先处理}for (int i = 2; i <= P; i++) {//一共建i个邮局for (int j = i; j <= N; j++) {//1~j村庄建i个邮局for (int k = i - 1; k <= j - 1; k++) {//1~k村庄建i-1个邮局dp[j][i] = min(dp[j][i], dp[k][i - 1] + dis[k + 1][j]);}}}printf("%d\n", dp[N][P]);}return 0;
}

POJ 1160 Post Office(经典DP)相关推荐

  1. poj 1160 Post Office(DP简单题)

    给n个村子建p个邮局,求最佳的建设方案使得每个村子到最近的邮局的距离和最短,输出最短距离. 首先递推求出n个村子建1个邮局的最佳方案,画下图很容易理解. 再递推求解多个邮局的最佳方案,具体的看注释吧. ...

  2. poj 1160(Post Office)

    http://poj.org/problem?id=1160 先讲讲我的思路:这道题首先很容易想到是用动态规划思想,所以我定义了一个二维数组dp[i][j],表示前j个位置,修建了i个邮局.所以推导出 ...

  3. POJ 1160 Post Office

    WA 1. 写出了 dist[][] 数组和 minDist() 函数, 实现了 minDist 函数但最终却是使用了 dist 数组 不一致 代码 #include <iostream> ...

  4. 经典dp最长递增子序列

    经典dp最大递增子序列,  看了好长时间,看了好多版本.最终因为这个看懂,也觉得这个是最全面的吧,我感觉我好菜啊. http://wenku.baidu.com/view/bed07b15552707 ...

  5. 最小编辑距离算法 Edit Distance(经典DP)

    最小编辑距离算法 Edit Distance(经典DP) 转载baodream 最后发布于2018-05-23 11:36:32 阅读数 22226  收藏 展开 编辑距离(Edit Distance ...

  6. poj 1163经典DP

    DP(Dinamic Programming),即为动态规划.     应该来说DP算法在ACM中是比较常见,也是比较难的,当然,做多了就不觉得难了,这是一条亘古不变的自然规律.以前在做ACM题的时候 ...

  7. poj1161Post Office【经典dp】

    题目:poj1161Post Office点击打开链接 题意:给出一条直线上的n个坐标表示村庄的位置,然后要在上面建p个邮局.村民优先选择去近的邮局.问全部村庄去邮局的最小距离和是多少? 分类:区间d ...

  8. poj 1160 dp

    题意:n个村庄建p个邮局,最短距离和. dp[MAXN][35];//dp[i][j]表示前i个村庄有j个post且第i个村庄有post的最小值 优化前(969ms....): View Code 1 ...

  9. POJ 3046 Ant Counting ( 多重集组合数 经典DP )

    题意 : 有 n 种蚂蚁,第 i 种蚂蚁有ai个,一共有 A 个蚂蚁.不同类别的蚂蚁可以相互区分,但同种类别的蚂蚁不能相互区别.从这些蚂蚁中分别取出S,S+1...B个,一共有多少种取法. 分析 :  ...

最新文章

  1. bzoj29894170数列——二进制分组+主席树
  2. 华为--PPP典型配置举例
  3. docker 限制cpu使用率
  4. AXI_05 AXI_FULL_IP的设计与验证
  5. Windos下navcat连接虚拟机中的mysql
  6. 解决 Unable to translate SQLException with Error code ‘17059‘, will now try the fallback translator
  7. 计算机一级2016版本ms,2016计算机等级一级《MS Office》试题与答案
  8. 半解TextBox灵异事件背后神秘的深度灵异事件
  9. 2019web前端全新面试题库 一
  10. PHP面向对象之领域模型+数据映射器
  11. android 银行卡号 4位,Android中的EditText输入银行卡号四位空一格
  12. mac 重置 Mac 上的 NVRAM 或 PRAM
  13. 虚拟化是什么,虚拟化主要分为哪几种?
  14. 44学习自动化运维工具 Chef 的基本用法,包括厨师编写、节点管理
  15. 网络安全:为大家介绍5种常见的加密算法
  16. MathRound修约
  17. 读书笔记—做事坚定,做人柔软
  18. 《大规模元搜索引擎技》——第1章 绪言1.1 Web上查找信息
  19. python from __future__ import
  20. 游戏音乐的成长经历了哪些?

热门文章

  1. 郭明錤:预计2022年Meta头显总体发货量将达到1200万台
  2. C++中延时的几种使用方式
  3. 将项目生成api及maven依赖,用feign暴露接口给外部调用
  4. Macbook pro终端中文乱码
  5. 【python】练习:长度转换
  6. 5.20下周黄金行情走势分析及开盘独家交易策略
  7. HDU 2064 汉诺塔III(递归)
  8. 台式计算机风扇,台式电脑风扇声音大怎么办_台式风扇噪音大怎么解决
  9. PHP3d生成图片,3d-photo-inpainting
  10. 模拟电路-振荡电路、振荡电路类型 (一)