这题是一道区间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. codeforces 979B Treasure Hunt

    题意: 给出三个字符串,每个字符串长度相同,给出n,要求在n轮内,每一个字符串必须改变一个字符. 问最后哪个字符串中拥有最多相同的字符,即美丽度最大. 思路: 首先,很不容易想到的一点是从a变到a,有 ...

  2. 20155228 获取技能的成功经验和关于C语言学习的调查

    内容提要 你有什么技能比大多人(超过90%以上)更好?针对这个技能的获取你有什么成功的经验?与老师博客中的学习经验有什么共通之处? 有关C语言学习的调查 你是怎么学习C语言的?(作业,实验,教材,其他 ...

  3. 前端和后台BUG区分方法

    测试工程师不只是负责发现问题,除了发现问题这种基本功外,定位问题,提出解决方案,提出预防方案也是要掌握的技能.这里先说定位问题的要求,定位问题要向深入,前提当然是对功能.产品的流程.开发方案.开发人员 ...

  4. Spring boot jackson

    Spring boot 所引用的包里面包含 jackson-databind-2.8.3.jar jackson-annotations-2.8.3.jar jackson-core-2.8.3.ja ...

  5. 了解一下UTF-16

    1)先啰嗦一下 UTF-16是一种编码格式.啥是编码格式?就是怎么存储,也就是存储的方式. 存储啥?存二进制数字.为啥要存二进制数字? 因为Unicode字符集里面把二进制数字和字符一一对应了,存二进 ...

  6. 【Alpha版本】冲刺阶段——Day5

    [Alpha版本]冲刺阶段--Day5 阅读目录 今日进展 问题困难 明日任务 今日贡献量 站立式会议 TODOlist [今日进展] 完成登录类代码 public void LOGIN() { co ...

  7. EasyUi通过POI 实现导出xls表格功能

    Spring +EasyUi+Spring Jpa(持久层) EasyUi通过POI 实现导出xls表格功能 EasyUi界面: 点击导出按钮实现数据导入到xls表格中 第一步:修改按钮事件: @Co ...

  8. django 集合

    1,前言 socket 位于应用层和传输层之间的一个抽象层,它是一个接口. 百度的服务器(socket服务端) . 启动socket . 绑定ip和端口 . 监听 . 接收数据 . 发送数据 . 断开 ...

  9. GUI常用对象介绍2

    %示意line对象的用法 hf=figure; hl=plot([:]); %示意line对象的属性 get(hl) %设置line的颜色 set(hl,'Color','r'); %设置每个点形状 ...

  10. StructureStreaming与kafka集成读取数据必要的jar包

    <dependency> <!--structurStreaming读取kafka1.0以下必须的jar--> <groupId>org.apache.spark& ...