BZOJ4518——二维斜率优化dp

斜率优化动态规划DP 斜率优化DP 立即下载

Description

Pine开始了从S地到T地的征途。
从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站。
Pine计划用m天到达T地。除第m天外,每一天晚上Pine都必须在休息站过夜。所以,一段路必须在同一天中走完。
Pine希望每一天走的路长度尽可能相近,所以他希望每一天走的路的长度的方差尽可能小。
帮助Pine求出最小方差是多少。
设方差是v,可以证明,v×m2v×m^2v×m2是一个整数。为了避免精度误差,输出结果时输出v×m2v×m^2v×m2。
Input

第一行两个数 n、m。
第二行 n 个数,表示 n 段路的长度
Output

一个数,最小方差乘以 m^2 后的值

Sample Input

5 2

1 2 5 8 6
Sample Output

36
HINT

1≤n≤3000,保证从 S 到 T 的总路程不超过 30000


这道题要求的是最小的方差的值,所以我们可以想到一个简单的dp方程
f[i][j]=min(f[i][j],f[k][j-1]+(sum[i]-sum[k]-average)²)
其中f[i][j]表示目前到i位置,走了j天的当前最小累计方差值。
那么我们肯定可以用O(N²M)的复杂度来做,直接枚举i,j,k即可。但是这样是过不了这道题的。所以我们进行斜率优化。接下去的推演我就不写了,因为这种方法过不了
注意因为我们要推得DP是二维的,所以进行优化的时候就要for一个m,然后再去循环n的值。并且每次for过一个n后就要将队列清空(重新维护一个凸包)。
然后就有了代码:
因为平均数可能是小数,所以开double,然后因为精度问题luogu上爆了一个点。我也不知道为什么
#include<bits/stdc++.h>
#define MAXN 3005
#define ll long long
using namespace std;
ll read(){
    char c;ll x;while(c=getchar(),c<'0'||c>'9');x=c-'0';
    while(c=getchar(),c>='0'&&c<='9') x=x*10+c-'0';return x;
}
ll n,m,w,r,a[MAXN],sum[MAXN],q[MAXN];
double ave,f[MAXN][MAXN];
double sqr(double x){return x*x;}
double y(ll i,ll t){return (double)f[i][t-1]+sqr(sum[i])+2*sum[i]*ave;}
double x(ll i){return (double)sum[i];}
double k(ll u,ll v,ll t){
    return (double)(y(u,t)-y(v,t))/(x(u)-x(v));
}
int main()
{
    n=read();m=read();
    for(ll i=1;i<=n;i++) a[i]=read(),sum[i]=sum[i-1]+a[i];
    ave=(double)sum[n]/m;
    for(ll i=1;i<=n;i++) f[i][1]=(double)sqr(sum[i]-ave);
    for(ll i=1;i<=m;i++) f[0][i]=(double)sqr(ave);
    for(ll i=2;i<=m;i++){
        w=r=0;
        for(ll j=1;j<=n;j++){
            while(r<w&&2*sum[j]>k(q[r],q[r+1],i)) r++;
            ll p=q[r];f[j][i]=(double)f[p][i-1]+sqr(sum[j]-sum[p]-ave);
            while(r<w&&k(q[w-1],q[w],i)>k(q[w-1],j,i)) w--;
            q[++w]=j;
        }
    }
    printf("%.0lf",f[n][m]*m);
    return 0;
}
辗转了很久也没有办法,只好去抄网上大佬的题解,结果发现果然有不同的做法。
出题人求的V∗m²V*m²V∗m²真的是另有深意。抱歉,我出题人真的是可以为所欲为的!!!
我们来推式子:
V*m²=∑(Vx-average)²/m*m²
    =∑(Vx-average)²*m
    =m*∑Vx²-2*m*∑Vx*average+average²*m*m   // average=sum[n]/m
    =m*∑Vx²-2*∑Vx*sum[n]+sum[n]²
    =m*∑Vx²-2*sum[n]²+sum[n]²
    =m*∑Vx²-sum[n]²
其中VxVxVx就是第x天走的路程和,所以我么改变一下dp方程:
f[i][j]表示到i走j天的Vx²Vx²Vx²的和
f[i][j]=min(f[i][j],f[k][j-1]+(sum[i]-sum[k])²)
最后答案就是f[n][m]²∗m−sum[n]²f[n][m]²*m-sum[n]²f[n][m]²∗m−sum[n]²。
接下去就是欢乐的推式子了:
f[i][j]=f[k][j-1]+sum[i]²-2*sum[i]*sum[k]+sum[k]²
f[i][j]+2*sum[i]*sum[k]=f[k][j-1]+sum[i]²+sum[k]²
  b    +    k   *  x   =         y     
2*sum[i]单调递增,所以我们就用单调队列维护一个下凸包即可。
#include<bits/stdc++.h>
#define ll long long
#define MAXN 3005
using namespace std;
ll read(){
    char c;ll x;while(c=getchar(),c<'0'||c>'9');x=c-'0';
    while(c=getchar(),c>='0'&&c<='9') x=x*10+c-'0';return x;
}
ll n,m,ave,w,r,a[MAXN],sum[MAXN],f[MAXN][MAXN],q[MAXN];
ll sqr(ll x){return x*x;}
double y(ll i,ll t){return f[i][t-1]+sqr(sum[i]);}
double x(ll i){return sum[i];}
double k(ll u,ll v,ll t){
    return (double)(y(u,t)-y(v,t))/(x(u)-x(v));
}
int main()
{
    n=read();m=read();
    for(ll i=1;i<=n;i++) a[i]=read(),sum[i]=sum[i-1]+a[i];
    for(ll i=1;i<=n;i++) f[i][1]=sqr(sum[i]);
    for(ll i=2;i<=m;i++){
        w=r=0;
        for(ll j=1;j<=n;j++){
            while(r<w&&2*sum[j]>k(q[r],q[r+1],i)) r++;
            ll p=q[r];f[j][i]=f[p][i-1]+sqr(sum[j]-sum[p]);
            while(r<w&&k(q[w-1],q[w],i)>k(q[w-1],j,i)) w--;
            q[++w]=j;
            
        }
    }
    printf("%lld",f[n][m]*m-sqr(sum[n]));
    return 0;
}
centos7安装db2 version11.1 阅读详情

相关推荐

Matlab处理气象数据(六)数据的面积加权

由于地理投影导致导致每个像元实际地面面积不同,越靠近北极实际面积越小,越靠近赤道实际面积越大,如果不进行面积加权就简单平均,会导致温度较实际温度偏低。 用以下公式计算地理投影每个像元的面积: double pi = 3.1415926; double R = 6371007.181; //units - m double area = (pi/180.0)*R*R*fabs(sin(dLat1/180.0*pi) - sin(dLat2/180.0*pi)) * fabs(dLon1 - dLo

设计の诗 1万+

HDU 2829 (二维斜率优化)

题意 给你长度为n的序列,可以切m刀将序列切成m+1个子段。每个子段的价值为子段中任意两个数的乘积的总和,让总价值最小。 思路 定义数组s[i]=∑a[i]s[i]=\sum a[i]s[i]=∑a[i],数组e[i]=∑a[i]2e[i]=\sum a[i]^2e[i]=∑a[i]2。 定义状态f[i][k]f[i][k]f[i][k]代表前i个数,且k刀的最小价值。可以这样转移 f[i][k]...

No cost too great! 304

Plot3d 网格数据格式

PLOT3D是一个计算机图形程序,旨在可视化计算流体力学的网格和解决方案。PLOT3D文件可以是ASCII, 也可是Fortran unformatted 或 C binary形式。PLOT3D文件分为网格文件(XYZ 文件), 空气动力学结果文件 (Q 文件)和通用结果文件(函数文件 + 函数名称文件)。网格文件中可加入所谓的IBlank参数。

weixin_62592231的博客 3714

hdu2829之二维斜率优化DP

T. E. Lawrence was a controversial figure during World War I. He was a British officer who served in the Arabian theater and led a group of Arab nationals in guerilla strikes against the Ottoman Empir

Stephen 2804

【ArcGIS Pro微课1000例】0022:基于DEM进行流域分析生成流域图

填洼Fill,在进行水文分析后续操作前,首先要对DEM进行填洼,创建无凹陷点的DEM。在ArcGIS中使用的是八方向流量建模(D8算法),工具位于水文分析下的【流向】。填洼需要使用水文分析工具下的【填洼】。确定输入与输出即可。

智慧空间实验室 2739

在 SAP S/4HANA Public Cloud 中,用 RAP 一键生成 PDF 并在 Fiori 前端触发下载的完整方案

create;update;delete;// 生成并返回当前文档上下文。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 389

[学习笔记]斜率优化dp 总结

我们学过不少优化类的算法了,大部分都是基于凸函数的性质给出的优化,比如Slope Trick,Wqs二分,又比如今天的斜率优化(不知道什么时候会有空把Slope Trick写掉)当dp式子满足cy−cxby−bx≤−aiby​−bx​cy​−cx​​≤−ai​的时候,我们要维护的是一个下凸包i

sophilex的博客 2127

ST03N 里看不到 SE38 / SA38?别急,这不是没记录,而是被换了名字

摘要:SAP系统中SE38/SA38事务码在ST03N统计中可能"隐身",因其对话步骤被归集到对应的程序名(如SE38→RSABAPPROGRAM)。ST03N侧重工作负载聚合统计,而STAD提供短期明细记录。正确排查方法是:在ST03N中搜索程序名而非事务码,再通过STAD验证具体使用情况。这一现象在权限整改和审计中易造成误判,建议将程序名纳入常规监控,并区分ST03N(趋势分析)与STAD(事实校验)的不同用途。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 936

斜率优化DP

斜率优化DP

qq_55788328的博客 1266

FAST-LIVO2 源码精读(一):系统总览——从 LIO 到 LIVO 的多传感器融合架构

本文是「FAST-LIVO2 激光-惯性-视觉里程计源码精读」专栏的开篇。全专栏共 18 篇,锚定香港大学 MaRS 实验室 2025 年 1 月开源的官方代码,逐模块剖析这套登上 T-RO’24 的多传感器融合系统。开篇先建立全局认知:FAST-LIVO2 所要解决的问题、整体框架的构成,以及源码主线的数据流动。

PX4-SLAM-PNC 573

C# MVVM的“核武器”:CommunityToolkit.Mvvm的RelayCommand实战全解

你默默打开VS:“该用RelayCommand的‘量子纠缠’魔法了!用户点击按钮无响应,调试器显示命令未绑定,但代码看起来完美无缺。“我的MVVM应用?那可是能穿越线程的命令量子计算机!异步操作阻塞了UI线程,用户界面变成“加载中”死循环。:UI与业务逻辑通过命令“量子隧道”解耦。:所有长时间操作自动进入“量子跃迁”模式。:携带任意上下文的“量子信封”传递。:命令可用性随数据变化实时同步。

java专栏 658

学习笔记——斜率优化dp

优异算法,动态规划。掌上明珠,斜率优化。确实,斜率优化很重要,并且通常式子比码长,脑袋想不清。新手易懂的斜率优化博客来啦!注:其中全部图片均为手绘,不喜勿喷。

Young_20220202的博客 791

在 Eclipse 中接入 DeepSeek:开启 Java 开发新效率

DeepSeek 能够根据自然语言描述,精准生成高质量的 Java 代码片段。无论是简单的方法编写,比如 “编写一个 Java 方法,用于计算两个整数的乘积”,还是复杂的类和功能模块创建,例如 “创建一个 Java 类,实现文件的读写操作,并包含异常处理机制”,它都能快速给出合理且可运行的代码示例。DeepSeek 生成的代码不仅实现了基本功能,还遵循 Java 的编码规范,添加了必要的注释,让代码更易于理解和维护,大大节省了开发者从头编写代码的时间和精力。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 4051

浅谈WQS二分、带权二分、凸优化与一类斜率优化DP

幕天题意一个简单的转化二维DP朴素斜率优化带权二分我们先看一道简单题题意分析代码进入正题题目回顾分析加权权与段数的关系单调性两个问题DP朴素DP斜率优化就题论题的分析方法一个普适的结论代码后记 除最后一张普适公式外,文中所有图像和公式均为原创,转载请附出处谢谢!!! 题意 [BZOJ 4518] Sdoi2016 征途 求nnn个数a1,a2,⋯ ,ana_1,a_2,\cdots,a_na1​,...

ixRic 1463

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【BZOJ4518】征途,斜率优化DP

真理是上帝手中破裂的镜子,每个人手里都拿了一块。

xiaoyimi的博客 2447

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

斜率优化dp再探 (模板) BZOJ 3156 & BZOJ 4518

好久没写模板了,心情小激动…… 斜率优化dp的话,到目前为止也已经做了好几道题了,除了一开始的第一道题,其他的所有题目基本上是自己一步一步推出来的, o(*≧▽≦)ツ…… 好了不得瑟了,回归正题。如上次所说的,斜率优化dp就是先写出dp方程,然后经过一些列的变化,变成斜率的表达式,然后维护单调队列优化即可。那么,我们多看几个题巩固一下吧。 别忘了此篇文章有模板哦~

alpc_qleonardo 672

【BZOJ4518】[Sdoi2016]征途 斜率优化

【BZOJ4518】[Sdoi2016]征途 Description Pine开始了从S地到T地的征途。 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站。 Pine计划用m天到达T地。除第m天外,每一天晚上Pine都必须在休息站过夜。所以,一段路必须在同一天中走完。 Pine希望每一天走的路长度尽可能相近,所以他希望每一天走的路的长度的方差尽可能小。 帮助Pine求出...

weixin_30678821的博客 71

bzoj4518 [Sdoi2016]征途(斜率优化dp)

分析: 斜率优化dp 很多人做斜率优化的时候喜欢画出斜率 我偏向画柿子题目就是把若干个元素分成m份, 每一份的价值是该组中的元素之和 使得m组数的方差最小平均数:x=(sum[1]+sum[2]+..+sum[m])/m //sum是每一组的价值 x=(Σa[i])/m 方差:s=((sum[1]-x)^2+(sum[2]-x)^2+…+(sum[m]-x)^2)/m先想状态

Coco_T的博客 542

征途(bzoj 4518)

题目 Pine开始了从S地到T地的征途。 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站。 Pine计划用m天到达T地。除第m天外,每一天晚上Pine都必须在休息站过夜。所以,一段路必须在同一天中走完。 Pine希望每一天走的路长度尽可能相近,所以他希望每一天走的路的长度的方差尽可能小。 帮助Pine求出最小方差是多少。 设方差是v,可以证明,v×m^ 2是一个整数。为了避免精度误差...

扬弃 307

【bzoj4518】[Sdoi2016]征途 斜率优化dp

原文地址:http://www.cnblogs.com/GXZlegend/p/6812435.html 题目描述 Pine开始了从S地到T地的征途。 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站。 Pine计划用m天到达T地。除第m天外,每一天晚上Pine都必须在休息站过夜。所以,一段路必须在同一天中走完。 Pine希望每一天走的路长度尽可能相近,所以他希...

weixin_30823683的博客 110

bzoj4518[Sdoi2016] 征途

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4518 题目大意: 相当于:n个数字,将其分成m段,每段的数字和为该段的值,使方差最小..

照月之白 966

AI开发中的版权合规:从数据收集到模型部署的技术实践

在人工智能技术快速发展的背景下,版权合规成为AI开发的重要议题。从技术原理来看,AI模型训练涉及大量数据使用,这直接关系到版权法中的合理使用边界。通过实施差分隐私、数据增强等技术方案,开发者可以在保障模型性能的同时降低侵权风险。在工程实践中,建立数据来源验证、内容过滤和输出监控等机制,能够有效识别和管理版权风险。特别是在使用网络爬虫收集训练数据时,需要重点关注数据授权状态和版权声明检测。这些技术措施的应用场景涵盖从数据预处理到模型部署的全流程,最终帮助开发者构建合规的AI系统。

weixin_34072458的博客 301

BZOJ4518: [Sdoi2016]征途

【传送门:BZOJ4518】 简要题意:   给出n个数,要求分成m个段,使得这些段的数和的方差最小,并将方差*m^2 题解:   斜率优化DP   我们设ans为最后的答案,sum表示所有的数之和,c[i]表示最优解中第i段数字和   下面式子中,1<=i<=m   ans=[∑(c[i]-sum/m)^2]/m*m^2   =[∑(c[i]-sum/m)^2...

weixin_30594001的博客 77

STM32F407无FIFO驱动OV7670:DCMI+DMA双缓冲图像采集实战

在嵌入式图像采集领域,摄像头接口协议与DMA数据搬运是决定系统实时性的核心技术。STM32F407集成的DCMI外设专为并行摄像头设计,配合DMA双缓冲的乒乓机制,可在无FIFO模块的情况下稳定接收OV7670输出的图像数据,显著降低硬件成本与PCB面积。本文从通用概念切入,先阐述DCMI与DMA双缓冲的工作原理及其在高速数据流处理中的价值,再结合低成本图像采集、嵌入式视觉入门等典型应用场景,自然引出无FIFO方案的具体实现。内容涵盖硬件接线、SCCB寄存器配置、CubeMX图形化初始化以及LCD实时显示的

weixin_34248705的博客 322
上一篇: HHHOJ#143——并查集离线+树链剖分
下一篇: 替罪羊树及其模板
stevensonson
博客等级 码龄9年 31粉丝 181原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值