超市规划

时间限制: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. 利用TokyoTyrant构建兼容Memcached协议、支持故障转移、高并发的分布式Key-value持久存储系统(转)

    Tokyo Cabinet 是日本人 平林幹雄 开发的一款 DBM 数据库,该数据库读写非常快,哈希模式写入100万条数据只需0.643秒,读取100万条数据只需0.773秒,是 Berkeley D ...

  2. 用HAProxy和KeepAlived构建高可用的反向代理系统

    对于访问量较大的网站来说,随着流量的增加单台服务器已经无法处理所有的请求,这时候需要多台服务器对大量的请求进行分流处理,即负载均衡.而如果实现负载均衡,必须在网站的入口部署服务器(不只是一台)对这些请 ...

  3. hadoop12---java并发编程的一些总结

    java并发编程的一些总结 %.1.不应用线程池的缺点 有些开发者图省事,遇到需要多线程处理的地方,直接new Thread(...).start(),对于一般场景是没问题的,但如果是在并发请求很高 ...

  4. Spring AOP(5)-- 注解

    applicationContext.xml <?xml version="1.0" encoding="UTF-8"?><beans xml ...

  5. 最大字串和问题(Maximum Subarray)

    问题描述: ind the contiguous subarray within an array (containing at least one number) which has the lar ...

  6. Kubernetes学习整理

    修改镜像仓库 官方提供的时google源,显然是无法使用的.这里需要改成国内的源 cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kube ...

  7. Scala学习手记1 - 快速体验

    又重新开始了scala的学习,因为中断了太长时间,所以这次还得从零开始.学习的过程就记录在这个博客上了. 这次学习的教程是<scala程序设计 java虚拟机多核编程实战>,我在多看上买了 ...

  8. JNI_Z_10_Java的数组

    在Java中数组分为两种: (1).基本类型数组 (2).对象类型(Object[])的数组 (数组中存放的是指向Java对象中的引用) 一个能通用于两种不同类型数组的函数: GetArrayLeng ...

  9. Maven添加Oracle驱动及依赖

    oracle驱动先去官网下载,下载下来后,需要安装到maven本地仓库,然后再pom中添加依赖. 1下载oracle驱动包 ojdbc6-11.2.0.3.jar 2命令行安装到maven仓库 mvn ...

  10. java中的Properties

    Properties类继承自HashTable类并实现了Map接口,也是使用一种键值对的形式来保存属性集.不过Properties有特殊的地方,就是它的键和值都是字符串类型. Properties中的 ...