超市规划

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

小Hi居住的城市的中轴线恰好是一条马路。沿着这条马路一共坐落有N个居民小区,其中第i个小区距离马路一端的距离是Ai。

现在市政厅决定在这条马路沿线修建K个超市(可以修建在任意实数位置),并且定义“不方便指数”是所有小区与最近的超市距离的平方之和。

当然市政厅希望“不方便指数”越小越好,请求出该指数的最小值。

输入

第一行包含两个整数N和K。

以下N行每行包含一个整数Ai。

对于50%的数据,1 ≤ N, K ≤ 100

对于100%的数据,1 ≤ N, K ≤ 2000 0 ≤ Ai ≤ 100000

输出

一个实数代表指数的最小值,保留3位小数。

样例输入
4 2
1
2
3
4
样例输出
1.000

有O(n^3)的解法,先知道两个结论:

1,i-j的点中找一个点,使得它到其他点的距离和最小,则这个点可以是下标为中值的点(也有可能一条线段,但是这个点再这条线段上,也满足),即x0=x[(i+j)/2];可以用反证法来证明。

2,i-j的线段上找一个点,使得它到其他点的距离平方的和最小,则这个点是几何中点,即x0=(xi+..xj)/(j-i+1);可以求偏导数来证明。

由2结论,我们得到如下代码:

其中c[i][j]是i到j中有一个超市时的最优解

则有O(n^3):

for(i=;i<=n;i++)
for(j=i+;j<=n;j++){
double mid=(sum[j]-sum[i-])/(j-i+);
for(k=i;k<=j;j++){
c[i][j]+=(a[i]-mid)*(a[i]-mid);
}
}

化简:c[i][j]=Σa[i]*a[i]+mid*mid-2*mid*a[i],则有O(n^2):

for(i=;i<=n;i++)
for(j=i+;j<=n;j++){
double mid=(suma[j]-suma[i-])/(j-i+);
c[i][j]=(summ[j]-summ[i-])+(j-i+)*mid*mid-*mid*(suma[j]-suma[i-]);
}

dp[i][j]表示前j个点有i个超市的最优解,则有O(nnk):

for(i=;i<=n;i++) dp[][i]=c[][i];
for(i=;i<=m;i++){
s[i][n+]=n;
for(j=n;j>=;j--){
for(k=;k<=j;k++)
if(dp[i][j]>dp[i-][k]+c[k+][j]){
s[i][j]=k;
dp[i][j]=dp[i-][k]+c[k+][j];
}
}
}

四边形不等式优化:则有O(nk);

 for(i=;i<=n;i++) dp[][i]=c[][i];
for(i=;i<=m;i++){
s[i][n+]=n;
for(j=n;j>=;j--){
for(k=s[i-][j];k<=s[i][j+];k++)
if(dp[i][j]>dp[i-][k]+c[k+][j]){
s[i][j]=k;
dp[i][j]=dp[i-][k]+c[k+][j];
}
}
}

所以O(n^2)就okey辣,鸡冻!

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int maxn=;
const double inf=;
double dp[maxn][maxn],c[maxn][maxn];
double a[maxn],suma[maxn],summ[maxn],s[maxn][maxn];
int main()
{
int n,i,j,k,m;
scanf("%d%d",&n,&m);
for(i=;i<=n;i++) {
scanf("%lf",&a[i]);
suma[i]=suma[i-]+a[i];
summ[i]=summ[i-]+a[i]*a[i];
}
sort(a+,a+n+);
for(i=;i<=n;i++) {
suma[i]=suma[i-]+a[i];
summ[i]=summ[i-]+a[i]*a[i];
}
for(i=;i<=n;i++)
for(j=i+;j<=n;j++){
double mid=(suma[j]-suma[i-])/(j-i+);
c[i][j]=(summ[j]-summ[i-])+(j-i+)*mid*mid-*mid*(suma[j]-suma[i-]);
}
for(j=;j<=m;j++)
for(i=;i<=n;i++)
dp[j][i]=inf;
for(i=;i<=n;i++) dp[][i]=c[][i];
for(i=;i<=m;i++){
s[i][n+]=n;
for(j=n;j>=;j--){
for(k=s[i-][j];k<=s[i][j+];k++)
if(dp[i][j]>dp[i-][k]+c[k+][j]){
s[i][j]=k;
dp[i][j]=dp[i-][k]+c[k+][j];
}
}
}
printf("%.3lf\n",dp[m][n]);
return ;
}

HihoCoder1621 : 超市规划(四边形DP优化)()的更多相关文章

  1. 区间DP的四边形不等式优化

    今天上课讲DP,所以我学习了四边形不等式优化(逃 首先我先写出满足四边形不等式优化的方程:

  2. hdu 2829 Lawrence(四边形不等式优化dp)

    T. E. Lawrence was a controversial figure during World War I. He was a British officer who served in ...

  3. 区间dp之四边形不等式优化详解及证明

    看了那么久的四边形不等式优化的原理,今天终于要写一篇关于它的证明了. 在平时的做题中,我们会遇到这样的区间dp问题 它的状态转移方程形式一般为dp[i][j]=min(dp[i][k]+dp[k+1] ...

  4. HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化

    HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化 n个节点n-1条线性边,炸掉M条边也就是分为m+1个区间 问你各个区间的总策略值最少的炸法 就题目本身而言,中规中矩的 ...

  5. 区间DP石子合并问题 & 四边形不等式优化

    入门区间DP,第一个问题就是线性的规模小的石子合并问题 dp数组的含义是第i堆到第j堆进行合并的最优值 就是说dp[i][j]可以由dp[i][k]和dp[k+1][j]转移过来 状态转移方程 dp[ ...

  6. BZOJ1563/洛谷P1912 诗人小G 【四边形不等式优化dp】

    题目链接 洛谷P1912[原题,需输出方案] BZOJ1563[无SPJ,只需输出结果] 题解 四边形不等式 什么是四边形不等式? 一个定义域在整数上的函数\(val(i,j)\),满足对\(\for ...

  7. 【整理】石子合并问题(四边形不等式DP优化)

    有很多种算法: 1,任意两堆可以合并:贪心+单调队列. 2,相邻两堆可合并:区间DP    (O(n^3)) ). 3,相邻,四边形不等式优化DP (O(n^2) ). 4,相邻,GarsiaWach ...

  8. 【转】斜率优化DP和四边形不等式优化DP整理

    (自己的理解:首先考虑单调队列,不行时考虑斜率,再不行就考虑不等式什么的东西) 当dp的状态转移方程dp[i]的状态i需要从前面(0~i-1)个状态找出最优子决策做转移时 我们常常需要双重循环 (一重 ...

  9. HDU 2829 Lawrence (斜率优化DP或四边形不等式优化DP)

    题意:给定 n 个数,要你将其分成m + 1组,要求每组数必须是连续的而且要求得到的价值最小.一组数的价值定义为该组内任意两个数乘积之和,如果某组中仅有一个数,那么该组数的价值为0. 析:DP状态方程 ...

随机推荐

  1. WPF使用Expression Design设计图形

    1.将画好的图形通过菜单导出成WPF xaml格式. 2.导出的文件就可以直接在WPF程序中使用了. 这里导出的DrawingBrush, <?xml version="1.0&quo ...

  2. 【WIN7】windows\system32 下的几乎所有文件的简单说明【2】

    1: System32的详解 C:\WINDOWS\system32... 2:   3: 这个 system32 文件夹中包含了大量的用于 Windows 的文件. 这里主要用于存储 DLL 文件, ...

  3. Linux中Nginx安装部署

    前言 Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器. Nginx 是由 Igor Sys ...

  4. 20145235李涛《网络对抗》Exp5 MSF基础应用

    基础问答 用自己的话解释什么是exploit,payload,encode? exploit:相当于搬运工,把攻击代码传送到靶机中. payload:相当于shellcode. encode:相当于包 ...

  5. 配置nginx,Tomcat日志记录请求耗时

    由于公司的业务比较特殊,对速度比较在意,客户最近反应我们的平台时间比较久,处理一个请求十秒左右才返回,领导要求找出原因,我想让nginx日志记录请求处理用了多长时间,后端处理用了多长时间,总共用了多长 ...

  6. [CF]Cycling City

    题目大意:给定一张无向图,问图中是否存在两个点,使得这两个点之间有三条路径,而且三条路径没有公共点. 解法: 我们可以先走出来一个环,再出环上任意一点走到另外一点.就像这样:

  7. Zookeeper初步了解

    Zookeeper初步了解: Zookeeper实现了许多复杂的事情,例如实现了Zookeeper Atomic Broadcasting Protocal来广播状态信息的变化,Fast Paxas ...

  8. [转载]织梦DEDE多选项筛选_联动筛选功能的实现_二次开发

    织梦默认的列表页没有筛选功能,但有时候我们做产品列表页的时候,产品的字段比较多,很多人都需要用到筛选功能,这样可以让用户更方便的找到自己所需要的东西,实现这个联动筛选功能需要对织梦进行二次开发,下面就 ...

  9. 未来简史之数据主义(Dataism)

    https://www.jianshu.com/p/8147239c9cb0?from=singlemessage junjguo 关注 2017.04.24 22:08* 字数 8116 阅读 31 ...

  10. 阿里云 centOS7.4新装nginx 不能访问

    反复装了几遍ngxin,什么防火墙,nginx.conf改了好几次都不能访问外网的ip, 原因是阿里云这货新的服务器根本就没开通443,80端口,真是坑人啊 点击配置规则,增加端口就行了 添加安全规则 ...