http://poj.org/problem?id=1160 (题目链接)

题意

  按照递增顺序给出一条直线上坐标互不相同的n个村庄,要求从中选择p个村庄建立邮局,每个村庄使用离它最近的那个邮局,使得所有村庄到各自所使用的邮局的距离总和最小。

Solution

  经典dp方程:

  其中f[i][j]表示前j个村庄,放置i个邮局的最优方案。w[i][j]表示在i到j的村庄放置一个邮局,i~j的村庄到这个邮局的总距离。考虑如何求解w[i][j],因为只放置一个邮局,所以一定是放在最中间的那个点上,所以邮局两侧的点到邮局的的距离之和就为它们两点之间的距离,然后从两边向中间扫描一遍更新答案就可以了。于是我们就得到了O(n*n*n*p)的做法。

  考虑四边形不等式优化。像dp方程长成形如“合并石子”那个样子的,很多都可以用四边形不等式优化。然而通过四边形不等式证明决策单调性实在是繁琐爆炸,看了一晚上感觉就是不停的放缩不等式强行证明。。其实当你感觉可以四边形不等式优化的时候,最有效的做法就是写个普通dp再写个优化后的dp进行对拍(→_→反正dp短)。

  于是经过四边形不等式优化后它的决策就神奇的具有单调性了→_→。设s[i][j]表示f[i][j]的决策方案。那么s[i-1][j]<=s[i][j]<=s[i][j+1]。所以我们枚举k的时候就不用从头枚到尾了,直接从s[i-1][j]枚到s[i][j+1]就可以了,所以复杂度就变成了O(n*n*p)。也许还有论文所说的O(n*p)的做法,就是把w[i][j]O(n)预处理,然而这如何O(n)预处理呢,我只会n²。。。

代码

// poj1160
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define inf 2147483640
#define MOD 998244353
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std;
inline LL getint() {
int f,x=0;char ch=getchar();
while (ch<='0' || ch>'9') {if (ch=='-') f=-1;else f=1;ch=getchar();}
while (ch>='0' && ch<='9') {x=x*10+ch-'0';ch=getchar();}
return x*f;
} const int maxn=500;
int f[maxn][maxn],sum[maxn][maxn],s[maxn][maxn],a[maxn];
int n,p; int dis(int i,int j) {
if (i>=j) return 0;
if (sum[i][j]!=0) return sum[i][j];
int x=i,y=j;
while (x<y) sum[i][j]+=a[y--]-a[x++];
return sum[i][j];
}
int main() {
while (scanf("%d%d",&n,&p)!=EOF) {
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
memset(f,0,sizeof(f));
memset(sum,0,sizeof(sum));
for (int i=1;i<=n;i++) f[1][i]=dis(1,i),s[i][i]=i-1;
for (int i=2;i<=p;i++) {
s[i][n+1]=n-1;
for (int j=n;j>=i;j--) {
f[i][j]=inf;
for (int k=s[i-1][j];k<=s[i][j+1];k++)
if (f[i-1][k]+dis(k+1,j)<f[i][j])
f[i][j]=f[i-1][k]+dis(k+1,j),s[i][j]=k;
}
}
printf("%d\n",f[p][n]);
}
return 0;
}

  

【poj1160】 Post Office的更多相关文章

  1. 题解【POJ1160】Post Office

    [POJ1160]Post Office Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 22362 Accepted: 1208 ...

  2. 【原创】利用Office宏实现powershell payload远控

    本文将演示使用Veil-Evasion生成远控所需要的payload以及监听器,然后使用MacroShop生成payload 相关的VBA代码,最后演示将VBA代码写入.doc文本文档的宏中. 环境: ...

  3. 【办公】Microsoft Office 2016 专业增强版下载及永久激活-亲测分享

    Win7 x64,安装 Office 2016. 1. 下载 Office 2016,用迅雷网上下载飞快.(这里分享我的下载链接,2.39G用迅雷分分钟就下好了) 2. 按 此博客 ,安装激活工具. ...

  4. 【POJ】【1160】Post Office

    DP/四边形不等式 邮局,经典的四边形不等式例题! 关于四边形不等式的学习请看 赵爽论文<动态规划加速原理之四边形不等式> 题目总结&题解:http://blog.csdn.net ...

  5. 【转载】Windows/Office“神key的来源”(附win8神key)

        凡是没有经过微软授权的渠道激活Windows/Office的全部是"D版"!但由于密钥激活更方便快捷,因此很受欢迎.从百度博客到现在,很多网友询问:"神key&q ...

  6. 【HHHOJ】NOIP模拟赛 捌 解题报告

    点此进入比赛 得分: \(30+30+70=130\)(弱爆了) 排名: \(Rank\ 22\) \(Rating\):\(-31\) \(T1\):[HHHOJ260]「NOIP模拟赛 捌」Dig ...

  7. 【四边形不等式】POJ1160[IOI2000]-Post Office

    [题目大意] v个村庄p个邮局,邮局在村庄里,给出村庄的位置,求每个村庄到最近邮局距离之和的最小值. [思路] 四边形不等式,虽然我并不会证明:( dp[i][j]表示前i个村庄建j个邮局的最小值,w ...

  8. HDU 5933 ArcSoft's Office Rearrangement 【模拟】(2016年中国大学生程序设计竞赛(杭州))

    ArcSoft's Office Rearrangement Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K ...

  9. 【转】【教程】office 2013 & visio 2013的激活

    原文网址:http://zhan.renren.com/sola86?gid=3602888498037097351&checked=true 1.下载安装文件 office和visio都有两 ...

随机推荐

  1. 理解java的finalize

    基本预备相关知识 1 java的GC只负责内存相关的清理,所有其它资源的清理必须由程序员手工完成.要不然会引起资源泄露,有可能导致程序崩溃. 2 调用GC并不保证GC实际执行. 3 finalize抛 ...

  2. java多线程系类:基础篇:06线程让步

    本系类的知识点全部来源于http://www.cnblogs.com/skywang12345/p/3479243.html,我只是复制粘贴一下,特在此说明. 概要 本章,会对Thread中的线程让步 ...

  3. QT 记事本小程序

    //mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <Q ...

  4. noi题库(noi.openjudge.cn) 1.8编程基础之多维数组T01——T10

    T01 矩阵交换行 描述 给定一个5*5的矩阵(数学上,一个r×c的矩阵是一个由r行c列元素排列成的矩形阵列),将第n行和第m行交换,输出交换后的结果. 输入 输入共6行,前5行为矩阵的每一行元素,元 ...

  5. 简单的js验证码

    转自:未找到 <script type ="text/javascript" language ="javascript">     var cod ...

  6. .net RPC框架选型

    近期开始研究分布式架构,会涉及到一个最核心的组件:RPC(Remote Procedure Call Protocol).这个东西的稳定性与性能,直接决定了分布式架构系统的好坏.RPC技术,我们的产品 ...

  7. Linux 中 Weblogic 启动和关闭

    a.start weblogic1)找到 /Oracle/Middleware/user_projects/domains/ 用户_domain目录. nohup ./startWebLogic.sh ...

  8. 【Flex】正则表达式

    1.基本语法 . 匹配除换行符"\n"外的任意单个字符. * 匹配前面Flex正则表达式的零次或多次出现.eg:Alert.show("ThisBookIsGoodBoo ...

  9. Linux学习笔记-Ubuntu添加右键菜单打开终端

    1.进入个人目录(如/home/batsing,下文缩写成 ~ ):设置显示隐藏文件,或使用命令行:2.进入 ~/.gnome2/nautilus-scripts 文件夹,新建一个文件,名为 term ...

  10. Java 的世界,我不懂:奇葩的 json 序列化

    先上张图,代表我心中的十万头草泥马: 写这么长的代码,头回见数组和单个实体共用同一个 json 节点的! 恐怕只有 java 社区的大牛B 才能做出这等事.. 由 Apache 发布: http:// ...