超市规划

时间限制: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. Storm--命令行解析

    strom的命令行解析 Commands: activate classpath deactivate dev-zookeeper drpc help jar kill list localconfv ...

  2. Spring中的定时调度(Scheduling)和线程池(Thread Pooling)

    使用triggers和SchedulerFactoryBean来包装任务 我们已经创建了job details,jobs.我们同时回顾了允许你调用特定对象上某一个方法的便捷的bean. 当然我们仍需要 ...

  3. iOS应用内付费(IAP)开发步骤

    1.苹果iTunes Connect内购产品信息录入. 1)创建app内购买项目(Create New),选择类型: 1.消耗型项目 对于消耗型 App 内购买项目,用户每次下载时都必须进行购买.一次 ...

  4. [HEOI2016/TJOI2016]求和(第二类斯特林数)

    题目 [HEOI2016/TJOI2016]求和 关于斯特林数与反演的更多姿势\(\Longrightarrow\)点这里 做法 \[\begin{aligned}\\ Ans&=\sum\l ...

  5. 微信小程序:其中wxml和wxss的样式说明

    微信小程序:其中wxml和wxss的样式说明 一.简介 对于css不熟悉的Android程序员来说,开发微信小程序面临的一个比较困难的问题就是界面的排版了.微信小程序的排版就跟wxml和wxss有关了 ...

  6. 使用本地JConsole监控远程JVM

    第一阶段 找到了2种配置,是否需要输入密码. 在 catalina.bat 文件新增如下脚本 第一种配置: rem HaoYang Set JAVA_OPTSset JAVA_OPTS=-Xms512 ...

  7. Spring注解(事务)

    spring操作数据库 jdbc <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc --> & ...

  8. python 获取探针页面,自动查询公司出口

    在一些渗透当中,我们需要批量探针出口来达到我们的目的. 所以就有了这个丑陋简洁的小脚本. #!/usr/bin/env python #-*- coding:utf- -*- import sys i ...

  9. cmake手册

    cmake手册 部分转载自:http://www.cnblogs.com/coderfenghc/tag/cmake/ CMake2.8.3 主索引 命令名称 用法 描述 命令选项 生成器 命令 属性 ...

  10. 从TensorFlow 到 Caffe2:盘点深度学习框架

    机器之心报道 本文首先介绍GitHub中最受欢迎的开源深度学习框架排名,然后再对其进行系统地对比 下图总结了在GitHub中最受欢迎的开源深度学习框架排名,该排名是基于各大框架在GitHub里的收藏数 ...