博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj1161Post Office【经典dp】
阅读量:6001 次
发布时间:2019-06-20

本文共 1234 字,大约阅读时间需要 4 分钟。

题目:poj1161Post Office

题意:给出一条直线上的n个坐标表示村庄的位置,然后要在上面建p个邮局。村民优先选择去近的邮局。问全部村庄去邮局的最小距离和是多少?

分类:区间dp

分析:对于随意一个村庄,仅仅有两种选择,要么在这儿建邮局。要么不建,我们能够预处理出来随意两件建立一个邮局的的最小距离w【i】【j】,而对于随意两点,建立一个邮局的最优方案是建立在两点的中位数上,即(i+j)/2。位置。

对于随意两点 i---j ,建立两个邮局的最优结果我们能够由建立一个的得到。枚举分点,然后从中间分开。前面建一个,后面建一个。

那么我们就能够写出状态及方程

定义状态:dp【i】【j】表示在前 i 个存在建立 j 个邮局的最小距离。

转移方程:dp【i】【j】=min(dp【i】【j】。dp【k】【j-1】+w【k+1】【i】) (j-1<=K<=i-1)

注意:

1:这个题目的dp方向是邮局数目。不是村庄数目,有建立邮局的数目1----p的方向dp

2:注意dp初始化后,其它值一定在循环内部初始化,否则不一定最优、

代码:

#include 
#include
#include
#include
#include
#include
using namespace std;#define Del(a,b) memset(a,b,sizeof(a))const int N = 500;int w[N][N];int dp[N][45];int dis[N];int main(){ //freopen("Input.txt","r",stdin); int n,k; while(~scanf("%d%d",&n,&k)) { for(int i=1;i<=n;i++) scanf("%d",&dis[i]); Del(w,0); for(int i=1;i<=n;i++) { for(int j=i+1;j<=n;j++) { w[i][j] = w[i][j-1]+ dis[j] - dis[(i+j)/2]; } //printf("\n"); } Del(dp,0x3f3f3f3f); for(int i=1;i<=n;i++) { dp[i][1]=w[1][i]; dp[i][i]=0; } for(int j=2;j<=k;j++) { for(int i=j+1;i<=n;i++) { dp[i][j]=0x3f3f3f3f;//注意标准写法 for(int f=j-1;f<=i-1;f++) dp[i][j]=min(dp[i][j],dp[f][j-1]+w[f+1][i]); } } printf("%d\n",dp[n][k]); } return 0;}

转载地址:http://zkdmx.baihongyu.com/

你可能感兴趣的文章
web服务器工作原理及http协议通信
查看>>
数据库查询某个字段值的位数 语法
查看>>
java file 文件操作 operate file of java
查看>>
WPF获取路径解读
查看>>
【实战HTML5与CSS3】用HTML5和CSS3制作页面(上)
查看>>
Android : 如何在WebView显示的页面中查找内容
查看>>
数字信号处理 基础知识 对比回顾
查看>>
分享个人Vim型材
查看>>
配置算法(第4版)的Java编译环境
查看>>
本学习笔记TCP/IP传输协议
查看>>
荣耀10GT升级EMUI 9.0体验分享:这可能是最好用的手机操作系统
查看>>
ZStack基于华芯通打造ARM国产云平台 助力云上贵州多项应用
查看>>
200本“保护日记”记录黄山迎客松生长变化
查看>>
多方力量携手呵护“中华水塔”青海三江源
查看>>
互联网的下一波红利在哪里?
查看>>
拿姐姐身份证登记结婚竟然成了!婚姻户籍信息共享难在哪儿
查看>>
恒大造车加速,联手柯尼塞格打造顶级新能源车
查看>>
JAVA大神说一个例子让你几分钟学会Annotation
查看>>
Python获取当前页面内的所有链接的五种方法
查看>>
【进阶2-3期】JavaScript深入之闭包面试题解
查看>>