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状态方程 ...
随机推荐
- iOS 自定义滑动切换TabbarItem 觉得设计丑也要做出来的UI效果。。。
UI丑却要继续做的感言: 对UI不满意的时候,就会觉得丑爆了,时间长了,却丑习惯了. 论前一阵子Tabbar 多丑,丑得最后不要tabbar了...但是自定义tabbar 和遇到的问题解决的过程可以记 ...
- Java内置锁synchronized的可重入性
学习自 https://blog.csdn.net/aigoogle/article/details/29893667 对我很有帮助 感谢作者
- hadoop16---反射
框架配置文件中,从字符串获取类和实例,调他的方法. 通过反射的方式可以获取class对象中的属性.方法.构造函数等,一下是实例: package cn.itcast_04_reflect; impor ...
- 外部类与main方法笔记
外部类 1. 外部public class只能有一个 2. 外部类只能有两种访问控制级别: public 和默认 3. 一个文件中,可以有多个public class,即外部类为public,还可以有 ...
- java鲁棒性(健壮性)
java能检测编译和运行时的错误 java自己操作内存减少了内存出错的可能 java实现了真数组,避免了覆盖数据的可能 Java不支持指针操作,大大减少了错误发生的可能性 ... 备注: Java能运 ...
- 《网络攻防》Web基础
20145224陈颢文 <网络攻防>Web基础 基础问题回答 什么是表单: 表单是一个包含表单元素的区域.表单元素是允许用户在表单中输入信息的元素.表单在网页中主要负责数据采集功能. 浏览 ...
- [UOJ210]寻找罪犯
2-sat神题.. 告诉是2-sat我也完全想不到正解. 看了看题解其实一步步分析也不算很难 这个题首先是要围绕每个人是否是犯人和每句话是否是真话来思考 首先要明确的是: 1.好人不说谎话 2.说了谎 ...
- zabbix邮件报警变量表
常用变量值 默认接收人:故障{TRIGGER.STATUS},服务器:{HOSTNAME1}发生: {TRIGGER.NAME}故障! 默认信息: 告警主机:{HOSTNAME1} 告警时间:{EVE ...
- JavaEE之反射
反射定义简单表述: 对于任意一个(动态的)运行中的类,我们都可以解剖它,获取类中的构造方法,成员变量,成员方法. 类的加载 (1)加载 就是指将class文件读入内存,并为之创建一个Class对象. ...
- Makefile文件应用——huge项目
提高复用性 在build目录下,保存公用部分make.rule (1)绝对路径 用ROOT变量保存项目根目录 (2)增加控制变量 EXE/LIB/ (3)头文件查找目录 gcc 的-I(i的大写)选项 ...