HihoCoder1621 : 超市规划(四边形DP优化)()
超市规划
描述
小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优化)()的更多相关文章
- 区间DP的四边形不等式优化
今天上课讲DP,所以我学习了四边形不等式优化(逃 首先我先写出满足四边形不等式优化的方程:
- hdu 2829 Lawrence(四边形不等式优化dp)
T. E. Lawrence was a controversial figure during World War I. He was a British officer who served in ...
- 区间dp之四边形不等式优化详解及证明
看了那么久的四边形不等式优化的原理,今天终于要写一篇关于它的证明了. 在平时的做题中,我们会遇到这样的区间dp问题 它的状态转移方程形式一般为dp[i][j]=min(dp[i][k]+dp[k+1] ...
- HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化
HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化 n个节点n-1条线性边,炸掉M条边也就是分为m+1个区间 问你各个区间的总策略值最少的炸法 就题目本身而言,中规中矩的 ...
- 区间DP石子合并问题 & 四边形不等式优化
入门区间DP,第一个问题就是线性的规模小的石子合并问题 dp数组的含义是第i堆到第j堆进行合并的最优值 就是说dp[i][j]可以由dp[i][k]和dp[k+1][j]转移过来 状态转移方程 dp[ ...
- BZOJ1563/洛谷P1912 诗人小G 【四边形不等式优化dp】
题目链接 洛谷P1912[原题,需输出方案] BZOJ1563[无SPJ,只需输出结果] 题解 四边形不等式 什么是四边形不等式? 一个定义域在整数上的函数\(val(i,j)\),满足对\(\for ...
- 【整理】石子合并问题(四边形不等式DP优化)
有很多种算法: 1,任意两堆可以合并:贪心+单调队列. 2,相邻两堆可合并:区间DP (O(n^3)) ). 3,相邻,四边形不等式优化DP (O(n^2) ). 4,相邻,GarsiaWach ...
- 【转】斜率优化DP和四边形不等式优化DP整理
(自己的理解:首先考虑单调队列,不行时考虑斜率,再不行就考虑不等式什么的东西) 当dp的状态转移方程dp[i]的状态i需要从前面(0~i-1)个状态找出最优子决策做转移时 我们常常需要双重循环 (一重 ...
- HDU 2829 Lawrence (斜率优化DP或四边形不等式优化DP)
题意:给定 n 个数,要你将其分成m + 1组,要求每组数必须是连续的而且要求得到的价值最小.一组数的价值定义为该组内任意两个数乘积之和,如果某组中仅有一个数,那么该组数的价值为0. 析:DP状态方程 ...
随机推荐
- Linux下解压分包文件zip(zip/z01/z02)【转】
本文转载自:https://www.cnblogs.com/EasonJim/p/7227109.html?utm_source=itdadao&utm_medium=referral Lin ...
- caffe python lmdb读写
caffe中可以采取lmdb健值数据库的方式向网络中输入数据. 所以操作lmdb就围绕"键-值"的方式访问数据库就好了. Write 我们可以采用cv2来读入自己的图像数据,采用d ...
- 关于C/C++中main函数参数的学习
因为面对对象作业(2018.5.21)的要求,去学习了C/C++中main函数参数的意义,以及一些简单的使用(从命令行指令的接受),不给予赘述.(仅为个人拙见,还望看官指正) 首先,带有参数的main ...
- Android解决软键盘弹出将布局顶到上面
有时候我们在下面的布局是一个RadioGroup,然后当页面中的EditText获得焦点的时候,会将地步的RadioGroup顶起来,这时候我们只需要在AndroidMainfest中RadioGro ...
- Ubuntu 16 下面的文件比较工具 Meld
安装 sudo apt-get install meld 使用 很好用,很方便.支持文件比较,文件夹比较.
- 红米手机.驱动.XP安装
1.发现 官网上下载的 驱动在 XP下安装不上去... (Win7 记得 貌似 没有问题...) 1.1.网上搜到的 解决方案为:解决手机不能连电脑 XP系统无法安装MTP设备驱动的终极解决_小米No ...
- html5适应屏幕的方案
适应屏幕的方案: 1.css3 Media queries (针对多版本设计稿) 2.设计稿不复杂的时候 通过宽度自适应用百分比 3.通过更新meta:viewport标签,通过设计稿尺寸 ...
- javaweb图片上传 tomcat重新部署 图片消失
标签: 图片上传tomcat重新部署图片消失原因分析以及解决办法 最近在做一个Javaweb的项目,涉及到图片上传,并且需要将图片通过URL回显给JSP页面,在调试的时候发现,上传到tomcat的 ...
- idea的常用设置
1.官网 官网:http://www.jetbrains.com/idea/download/#section=windows 官方文档:http://www.jetbrains.com/help/i ...
- @ResponseBody与@RestController的作用与区别
在使用springmvc框架的时候,在处理json的时候需要用到spring框架特有的注解@ResponseBody或者@RestController注解,这两个注解都会处理返回的数据格式,使用了该类 ...