2018.09.08 bzoj4518: [Sdoi2016]征途(斜率优化dp)
传送门
把式子展开后发现就是要求:
m∗(∑i=1msum′[i])−sum[n]2" role="presentation" style="position: relative;">m∗(∑mi=1sum′[i])−sum[n]2m∗(∑i=1msum′[i])−sum[n]2的最小值。
于是只需要求:
m∗(∑i=1msum′[i])" role="presentation" style="position: relative;">m∗(∑mi=1sum′[i])m∗(∑i=1msum′[i])的最小值。
于是设f[i][j]" role="presentation" style="position: relative;">f[i][j]f[i][j]表示前i个分了j组的最小值。
显然有:
f[i][j]=min(f[k][j−1]+(sum[i]−sum[k])2)" role="presentation" style="position: relative;">f[i][j]=min(f[k][j−1]+(sum[i]−sum[k])2)f[i][j]=min(f[k][j−1]+(sum[i]−sum[k])2)
<=>
f[i][j]=min(f[k][j−1]+sum[k]2−2sum[i]∗sum[k])+sum[i]2" role="presentation" style="position: relative;">f[i][j]=min(f[k][j−1]+sum[k]2−2sum[i]∗sum[k])+sum[i]2f[i][j]=min(f[k][j−1]+sum[k]2−2sum[i]∗sum[k])+sum[i]2
对于两个决策k1<k2" role="presentation" style="position: relative;">k1<k2k1<k2且k2比k1更优,有:
f[k1][j−1]+sum[k1]2−2sum[i]∗sum[k1]" role="presentation" style="position: relative;">f[k1][j−1]+sum[k1]2−2sum[i]∗sum[k1]f[k1][j−1]+sum[k1]2−2sum[i]∗sum[k1]
>
f[k2][j−1]+sum[k2]2−2sum[i]∗sum[k2]" role="presentation" style="position: relative;">f[k2][j−1]+sum[k2]2−2sum[i]∗sum[k2]f[k2][j−1]+sum[k2]2−2sum[i]∗sum[k2]
令t[k]=f[k][j−1]+sum[k]2" role="presentation" style="position: relative;">t[k]=f[k][j−1]+sum[k]2t[k]=f[k][j−1]+sum[k]2
=>
(t[k1]−t[k2])/(sum[k1]−sum[k2])<2sum[i]" role="presentation" style="position: relative;">(t[k1]−t[k2])/(sum[k1]−sum[k2])<2sum[i](t[k1]−t[k2])/(sum[k1]−sum[k2])<2sum[i]
果断斜率优化。
代码:
#include<bits/stdc++.h>
#define ll long long
#define N 3005
using namespace std;
inline ll read(){
ll ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
int n,m,hd,tl,q[N];
ll sum[N],f[N][N];
inline double slope(int k,int i,int j){return 1.0*(f[i][k]+sum[i]*sum[i]-f[j][k]-sum[j]*sum[j])/(sum[i]-sum[j]);}
int main(){
n=read(),m=read();
for(int i=1;i<=n;++i)sum[i]=sum[i-1]+read(),f[i][0]=1e18;
for(int j=1;j<=m;++j){
hd=tl=1,q[1]=0;
for(int i=1;i<=n;++i){
while(hd<tl&&slope(j-1,q[hd+1],q[hd])<2.0*sum[i])++hd;
int k=q[hd];
f[i][j]=f[k][j-1]+(sum[i]-sum[k])*(sum[i]-sum[k]);
while(hd<tl&&slope(j-1,q[tl],q[tl-1])>slope(j-1,i,q[tl]))--tl;
q[++tl]=i;
}
}
cout<<(m*f[n][m]-sum[n]*sum[n]);
return 0;
}
2018.09.08 bzoj4518: [Sdoi2016]征途(斜率优化dp)的更多相关文章
- bzoj4518[Sdoi2016]征途 斜率优化dp
4518: [Sdoi2016]征途 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1657 Solved: 915[Submit][Status] ...
- 洛谷 P4072 [SDOI2016]征途 斜率优化DP
洛谷 P4072 [SDOI2016]征途 斜率优化DP 题目描述 \(Pine\) 开始了从 \(S\) 地到 \(T\) 地的征途. 从\(S\)地到\(T\)地的路可以划分成 \(n\) 段,相 ...
- bzoj-4518 4518: [Sdoi2016]征途(斜率优化dp)
题目链接: 4518: [Sdoi2016]征途 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地 ...
- 2018.09.05 任务安排(斜率优化dp)
描述 这道题目说的是,给出了n项必须按照顺序完成的任务,每项任务有它需要占用机器的时间和价值.现在我们有一台机器可以使用,它每次可以完成一批任务,完成这批任务所需的时间为一个启动机器的时间S加上所有任 ...
- 【bzoj4518】[Sdoi2016]征途 斜率优化dp
原文地址:http://www.cnblogs.com/GXZlegend/p/6812435.html 题目描述 Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界 ...
- [bzoj4518][Sdoi2016]征途-斜率优化
Brief Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m天外,每一天晚上Pine都必须 ...
- BZOJ 4518: [Sdoi2016]征途 [斜率优化DP]
4518: [Sdoi2016]征途 题意:\(n\le 3000\)个数分成m组,一组的和为一个数,求最小方差\(*m^2\) DP方程随便写\(f[i][j]=min\{f[k][j-1]+(s[ ...
- [SDOI2016]征途 —— 斜率优化DP
时隔多年没有碰斜率优化了... 想当年被斜率优化虐的死去活来,现在看看...也就那样吧. Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计 ...
- 2018.09.29 bzoj3156: 防御准备(斜率优化dp)
传送门 斜率dp经典题目. 然而算斜率的时候并没有注意到下标的平方会爆int于是咕咕*2. 这道题我用了两个数组来表示状态. f[i]f[i]f[i]表示最后i个位置倒数第i个放木偶的最优值. g[i ...
随机推荐
- leetcode349
public class Solution { public int[] Intersection(int[] nums1, int[] nums2) { var list1 = nums1.ToLi ...
- FMX TListView 搜索 Search
FMX,FireMonkey,平台框架下TListView控件搜索.过滤. 查找功能确实强大!! 设置SearchVisibe属性为true,就自动显示搜索框,输入文字,就开始检索了,不用写一行代码! ...
- Simple2D-18(音乐播放器)使用 bass 音频库
BASS 简介 BASS是一个在多个平台上用于软件的音频库.其目的是为开发人员提供功能强大且高效的示例流(MP3,MP2,MP1,OGG,WAV,AIFF),MOD 音乐(XM,IT,S3M,MOD ...
- TEXT 3 Food firms and fat-fighters
TEXT 3 Food firms and fat-fighters 食品公司与减肥斗士 Feb 9th 2006 From The Economist Global Agenda Five lead ...
- do{}while() ;异常语句
//while (true) //只要括号里面是true(正确的如:(1==1)),就会无限循环 //{ //} //do{}while() //不管while满足与否,首先先做一遍 //然后去看wh ...
- 安装Anaconda以及jupyter的使用
1)下载https://www.anaconda.com/download/ 2)安装 3)终端查看(Anaconda Prompt) 4)升级所有的包 初次安装下的软件包版本一般都比较老旧,因此提前 ...
- zookeeper集群搭建 windows
本次zk测试部署版本为3.4.6版本,下载地址http://mirrors.cnnic.cn/apache/zookeeper/ 限于服务器个数有限本次测试了两种情况 1.单节点方式:部署在一台服务器 ...
- MySql ERROR 1045 (28000): Access denied 错误
[MySql ERROR 1045 (28000): Access denied 错误] 即登陆错误,使用MySql登陆时,需使正确的username/passwd.通过 -u -p 参数即可. My ...
- Web标准:五、超链接伪类
Web标准:五.超链接伪类 知识点: 1.链接的四种样式 2.将链接转换为块状 3.用css制作按钮 4.首字下沉 1)链接的四种样式 超链接有四个伪类,分别是: a:link 未访问的链接 a: ...
- Animation.wrapMode循环模式
WrapMode.Default:从动画剪辑中读取循环模式(默认是Once). WrapMode.Once:当时间播放到末尾的时候停止动画的播放. WrapMode.Loop:当时间播放到末尾的时候重 ...