区间DP POJ1160村庄邮局问题
题目大意:一系列村庄在一维坐标系上有序的排列,建设p个邮局,问各个村庄到邮局的最短距离和。
线性区间DP问题
dp数组的值为最短/最优距离
村庄和邮局为限制
dp[i][j]表示前i个村庄有j个邮局的最优解
分析最小子问题可得前i个村庄有1个邮局的最优解——中间的村庄
所以分解区间dp[i][j] = min(dp[i][j],dp[k][j-1] + sum[k+1][i])
sum[i][j]数组表示从i到j村庄放一个邮局的最优解
j,i,k的遍历,最终得到最优解
外层遍历的是邮局的个数,这样才能遍历村庄的个数(我们所未知的情况是村庄的个数大于邮局的个数)
对了sum【i】【j】和sum[i][j-1]存在某种关系呦,一推就出来了~~
#include <iostream>
#include <cstdio>
#include <string.h>
#define inf (1e8 + 9e7)
using namespace std;
const int maxn = 1e3 + 1e2;
int dp[maxn][maxn];
int sum[maxn][maxn];
int pos[maxn];
void init()
{
memset(sum,0,sizeof(sum));
}
int main()
{
int n,pn;
while(~scanf("%d%d",&n,&pn))
{
init();
for(int i = 1;i <= n;i++)
scanf("%d",&pos[i]); for(int i = 1;i <= n;i++)
{
for(int j = i+1;j <= n;j++)
{
sum[i][j] = sum[i][j-1] + pos[j] - pos[(i + j)/2];
}
dp[i][i] = 0;
} for(int i = 1;i <= n;i++)
{
dp[i][1] = sum[1][i];
} for(int j = 2;j <= pn;j++)//建造一个的情况已经铺垫好了
for(int i = j+1;i <= n;i++)//村庄首先必须保证得比
{
//接下来我要做的是遍历k来找到到底几个村庄放j-1个最优
dp[i][j] = inf;
for(int k = j - 1;k < i;k++)
{
dp[i][j] = min(dp[i][j],dp[k][j-1] + sum[k+1][i]);
}
}
printf("%d\n",dp[n][pn]);
}
return 0;
}
区间DP POJ1160村庄邮局问题的更多相关文章
- 题解——洛谷P4767 [IOI2000]邮局(区间DP)
这题是一道区间DP 思维难度主要集中在如何预处理距离上 由生活经验得,邮局放在中间显然最优 所以我们可以递推求出\( w[i][j] \)表示i,j之间放一个邮局得距离 然后设出状态转移方程 设\( ...
- Post Office IOI 2000 /// 区间DP oj24077
题目大意: 给定n个村庄的坐标,两个村庄之间的距离是其坐标之差的绝对值 最多能选m个村庄设立邮局,求设立邮局的地点使得各村庄与邮局距离总和最小 一, 所有的村庄看做在一条直线上 考虑三个因素:i 当前 ...
- P1220 关路灯 区间dp
题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯. 为了给村 ...
- BZOJ4856 JSOI2016 病毒感染 区间DP
传送门 原Word文档 题意:太长不给 这种题目一看就是区间DP 设$f_i$表示治愈了前$i$个村子的时候最少死了多少村民,又设前缀和为$sum_i$,通过枚举折返时最后经过的村子$j$,并且提前计 ...
- POJ 1160 经典区间dp/四边形优化
链接http://poj.org/problem?id=1160 很好的一个题,涉及到了以前老师说过的一个题目,可惜没往那上面想. 题意,给出N个城镇的地址,他们在一条直线上,现在要选择P个城镇建立邮 ...
- 山区建小学(区间DP)
山区建小学 时间限制: 1 Sec 内存限制: 128 MB提交: 17 解决: 5[提交][状态][讨论版][命题人:quanxing] 题目描述 政府在某山区修建了一条道路,恰好穿越总共m个村 ...
- 「LuoguP1220」 关路灯(区间dp
题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯. 为了给村 ...
- P4677 山区建小学|区间dp
P4677 山区建小学 题目描述 政府在某山区修建了一条道路,恰好穿越总共nn个村庄的每个村庄一次,没有回路或交叉,任意两个村庄只能通过这条路来往.已知任意两个相邻的村庄之间的距离为di 为了提高山区 ...
- [Luogu1220]关路灯(区间dp)
[Luogu1220]关路灯 题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏 ...
随机推荐
- JS 实现 jQuery的$(function(){});
1.浏览器渲染引擎的HTML解析流程 何谓“渲染”,其实就是浏览器把请求到的HTML内容显示出来的过程.渲染引擎首先通过网络获得所请求文档的内容,通常以8K分块的方式完成.下面是渲染引擎在取得内容之后 ...
- java读取properties文件时候要注意的地方
java读取properties文件时,一定要注意properties里面后面出现的空格! 比如:filepath = /home/cps/ 我找了半天,系统一直提示,没有这个路径,可是确实是存在的, ...
- AUC和ROC
https://www.cnblogs.com/gatherstars/p/6084696.html
- 企业类Web原型制作分享-Kraftwerk
这是一个设计师团队,将数码产品的创意发挥到极致.整个网站采用深黑色背景和图文搭配,网站有很多动画特效,均突出数码产品的质感.网站结合滚动区实现导航栏悬浮效果,用弹出面板实现点击弹出内容等交互效果. 本 ...
- 买茶叶想到的哪个比较便宜 x1/y1 >x2/y2 x代表多少钱 y代表 多少克 无聊的试炼
茶叶1 128元 200克 茶叶2 330元 160克 当然这个哪个便宜 一眼就知道了,这里不过抛砖引玉 128元 330元 200克 160克 我们把价钱用x表示 多少克 ...
- Partition Array into Disjoint Intervals LT915
Given an array A, partition it into two (contiguous) subarrays left and right so that: Every element ...
- 如何使用Log4j
如何使用Log4j? 1. Log4j是什么? Log4j可以帮助调试(有时候debug是发挥不了作 用的)和分析,要下载和了解更详细的内容,还是访问其官方网站吧: http://jakarta. ...
- 【Web】Nginx Rewrite规则
Rewrite介绍 Rewrite主要的功能就是实现URL的重写,Nginx的Rewrite规则采用Pcre,perl兼容正则表达式的语法规则匹配,如果需要Nginx的Rewrite功能,在编译Ngi ...
- python console 设立快捷键 学习源码 用到英语
arbitrary---随意 iterable----迭代 invalid syntax -----无效的语法 subscriptable ----可索引访问的
- centos 7 安装svn客户端
rpm -qa subversion yum remove -y subversion yum install -y subversion svnserve --version svn checkou ...