这题是一道区间DP

思维难度主要集中在如何预处理距离上

由生活经验得,邮局放在中间显然最优

所以我们可以递推求出\( w[i][j] \)表示i,j之间放一个邮局得距离

然后设出状态转移方程

设\( dp[i][j] \)表示从1开始到i放j个邮局的最短距离

然后转移为:\( dp[i][j]=min(dp[k][j-1]+w[k+1][j],dp[i][j]),i \le k \le j \)

显然是个\( O(n^{3}) \)的DP

能够得40分

#include <cstdio>
#include <algorithm>
#include <cstring>
#define int long long
using namespace std;
int w[][],dp[][],n,p,x[];
signed main(){
scanf("%lld %lld",&n,&p);
for(int i=;i<=n;i++)
scanf("%lld",&x[i]);
sort(x+,x+n+);
memset(w,0x3f,sizeof(w));
for(int i=;i<=n;i++)
w[i][i]=;
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
w[i][j]=w[i][j-]+x[j]-x[(i+j)/];
memset(dp,0x3f,sizeof(dp));
for(int i=;i<=n;i++)
dp[i][]=w[][i];
for(int i=;i<=p;i++)
dp[i][i]=;
for(int i=;i<=p;i++)
for(int j=i+;j<=n;j++)
for(int k=i-;k<=j;k++){
dp[j][i]=min(dp[j][i],dp[k][i-]+w[k+][j]);
//5 printf("%d %d %d %d\n",i,j,k,dp[j][i]);
}
/*for(int l=1;l<=n;l++)
for(int i=1;i+l<=n;++)
printf("w[%d][%d]=%d\n",i,i+l,w[i][i+l]);*/
printf("%lld\n",dp[n][p]);
return ;
}

然后就是优化

我们可以发现一些显然的性质

\( w[i^{'}][j] \le w[i][j^{'}] , i \le i^{'} \le j \le j^{'} \)

\( w[i][j]+w[i^{'}][j^{'}] \le w[i^{'}][j]+w[i][j^{'}] \)

然后就可以用四边形不等式优化DP了!

然后QwQ

复杂度\( O(n^{2}) \)

没了

#include <cstdio>
#include <algorithm>
#include <cstring>
#define int long long
using namespace std;
int w[][],dp[][],n,p,x[],s[][];
signed main(){
scanf("%lld %lld",&n,&p);
for(int i=;i<=n;i++)
scanf("%lld",&x[i]);
sort(x+,x+n+);
memset(w,0x3f,sizeof(w));
for(int i=;i<=n;i++)
w[i][i]=;
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
w[i][j]=w[i][j-]+x[j]-x[(i+j)/];
memset(dp,0x3f,sizeof(dp));
for(int i=;i<=n;i++)
dp[i][]=w[][i],s[i][]=;;
for(int i=;i<=p;i++)
dp[i][i]=;
for(int i=;i<=p;i++){
s[n+][i]=n;
for(int j=n;j>=i+;j--)
for(int k=s[j][i-];k<=s[j+][i];k++)
if(dp[j][i]>dp[k][i-]+w[k+][j]){
dp[j][i]=dp[k][i-]+w[k+][j];
s[j][i]=k;
//5 printf("%d %d %d %d\n",i,j,k,dp[j][i]);
}
}
/*for(int l=1;l<=n;l++)
for(int i=1;i+l<=n;++)
printf("w[%d][%d]=%d\n",i,i+l,w[i][i+l]);*/
printf("%lld\n",dp[n][p]);
return ;
}

题解——洛谷P4767 [IOI2000]邮局(区间DP)的更多相关文章

  1. 洛谷P2470 [SCOI2007]压缩(区间dp)

    题意 题目链接 Sol 神仙题Orz 考虑区间dp,如果我们只设\(f[l][r]\)表示\(s_{lr}\)被压缩的最小长度,而不去关心内部\(M\)分布的话,可能在转移的时候转移出非法状态 因此考 ...

  2. 洛谷P1018乘积最大——区间DP

    题目:https://www.luogu.org/problemnew/show/P1018 区间DP+高精,注意初始化和转移的细节. 代码如下: #include<iostream> # ...

  3. 洛谷P1220关路灯——区间DP

    题目:https://www.luogu.org/problemnew/show/P1220 区间DP. 代码如下: #include<iostream> #include<cstd ...

  4. 洛谷P1040 加分二叉树(区间dp)

    P1040 加分二叉树 题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,…,n),其中数字1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di, ...

  5. 洛谷 P1080 石子合并 ( 区间DP )

    题意 : 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分.试设计出1个算法,计算出将N堆石子合并成1堆 ...

  6. 洛谷$P1864\ [NOI2009]$二叉查找树 区间$dp$

    正解:区间$dp$ 解题报告: 传送门$QwQ$ 首先根据二叉查找树的定义可知,数据确定了,这棵树的中序遍历就已经改变了,唯一能改变的就是通过改变权值从而改变结点的深度. 发现这里权值的值没有意义,所 ...

  7. 洛谷P1063能量项链(区间dp)

    题目描述: 给定一串序列x[],其中的每一个Xi看作看作一颗珠子,每个珠子包含两个参数,head和tail,前一颗的tail值是后一个的head值,珠子呈现环形(是一条项链),所以最后一颗的tail是 ...

  8. 洛谷 P1043 数字游戏 区间DP

    题目描述 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易.游戏是这样的,在你面前有一圈整数(一共n个),你要按顺序将其分 ...

  9. 洛谷 P1220 关路灯 区间DP

    题目描述 某一村庄在一条路线上安装了 n 盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯. 为了 ...

随机推荐

  1. html5-样式的三种方式

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  2. QString字符串中双引号的梗

    [1]QString字符串不支持双引号 最近做项目(本地环境:WIN10 + QT5.9.2 + VS2017).有个需求,需要实现形如 "key="123456"&qu ...

  3. Django之真正创建一个django项目

    真正创建一个django项目 1 创建Django项目     :new-project 2 创建APP :  python manager.py startapp app01 3 setting 配 ...

  4. Java国际化号码验证方法,国内手机号正则表达式

    Java国际化号码验证方法,国内手机号正则表达式 中国电信号段 133.149.153.173.177.180.181.189.199 中国联通号段 130.131.132.145.155.156.1 ...

  5. 几种线程安全的Map解析

    转载自 面试必问-几种线程安全的Map解析 HashMap线程安全的吗? Java中平时用的最多的Map集合就是HashMap了,它是线程不安全的. 看下面两个场景: 1.当用在方法内的局部变量时,局 ...

  6. 常用正则表达式爬取网页信息及HTML分析总结

    Python爬取网页信息时,经常使用的正则表达式及方法. 1.获取<tr></tr>标签之间内容 2.获取<a href..></a>超链接之间内容 3 ...

  7. Python+OpenCV图像处理(五)—— 像素运算

    最近在忙毕业设计,只能偶尔更新博客........ 一.像素的算术运算 像素的算术运算涉及加减乘除等基本运算(要进行算术运算,两张图片的形状(shape)必须一样) 代码如下: #像素的算术运算(加. ...

  8. 如何使用 lsyncd 实时同步并执行 shell 命令

    修改 lsyncd 的默认配置,不直接执行rsync 进行同步,而是改用自己的脚本. binary 指定我们的脚本 vim /usr/local/lsyncd/etc/lsyncd.conf sett ...

  9. Linux的常用路由配置

    1.配置默认路由 ip route add default via 192.168.10.1 dev eth0 route add default gw 192.168.10.1 2.间接路由: ip ...

  10. VMware14安装centos7

    win10专业版 虚拟机:14 Pro 1. 新建虚拟机选择典型安装 2. 稍后安装操作系统 3. 选择Linux,版本选择centso7 64位(根据系统选择) 4. 设置虚拟机名称并选择安装位置 ...