首页 > 其他分享 >斜率优化学习笔记

斜率优化学习笔记

时间:2024-11-15 20:42:02浏览次数:1  
标签:right frac 薯片 ll 笔记 times 斜率 优化 dq

例题:薯片

小明现在体重 \(W\) 公斤,减肥将会持续 \(n\) 天。第 \(i\) 天如果不吃薯片体重将会减少 \(A\) 公斤,吃了体重会增加 \(D_i\) 公斤。但是不吃薯片实在是很难受,这个难受情况用压力值来描述。一开始压力值为 \(0\),每一天不吃薯片压力值将会增加 \(1\),吃了薯片压力值又会变回 \(0\)。每天结束的时候,小明的体重会增加 \(B \times 压力值\)。注意,小明有神奇的能力,体重可以是负的。小明想知道,\(n\) 天后他最多可以瘦到多少公斤?

要求时间复杂度 \(O(n)\)。

朴素的 DP!

设 \(f_i\) 为第 \(i\) 天吃了薯片的体重最小值(最终答案为 \(f_{n+1}\))。有:

\[f_i = \begin{cases} W & i = 0 \\ D_i + \min\limits_{j=0}^{i-1} \left(f_{i-j-1} - A \times j + B \times \frac {j \times (j+1)} 2\right) & \text{otherwise} \\ \end{cases}\]

时间复杂度 \(O(n^2)\)。

斜率优化的预备:重新整理转移式

\[\begin{aligned} f_i &= D_i + \min\limits_{j=0}^{i-1} \left(f_{i-j-1} - A \times j + B \times \frac {j \times (j+1)} 2\right) \\ f_i &= D_i + \min\limits_{j=0}^{i-1} \left(f_j - A \times (i-j-1) + B \times \frac {(i-j-1) \times (i-j)} 2\right) & j \gets i-j-1 \\ \end{aligned}\]

\[f_i - \left(D_i - A \times (i-1) + B \times \frac {i \times (i-1)} 2\right) = \min\limits_{j=0}^{i-1} \left(\left(f_j + A \times j + B \times \frac {j \times (j+1)} 2\right) - B \times i \times j\right) \]

令 \(P(i) = D_i - A \times (i-1) + B \times \frac {i \times (i-1)} 2\),\(Q(j) = f_j + A \times j + B \times \frac {j \times (j+1)} 2\)。则:

\[f_i - P(i) = \min\limits_{j=0}^{i-1} (Q(j) - B \times i \times j) \]

斜率优化!

众所周知,直线的解析式为 \(y = kx + b\)。可以写为 \(b = y - kx\)。

不妨把动态规划柿子中的 \(f_i - P(i)\) 看作 \(b\),\(Q(j)\) 看作 \(y\),\(B \times i\) 看作 \(k\),\(j\) 看作 \(x\)。

问题转化为:在已有的 \(i\) 个 \((j,Q(j))\) 的点中,找一个点 \(p\),作一条斜率为 \(k\) 的直线,求最小的截距。

因此,\(p\) 必定在已有的 \(i\) 个点的下凸壳上。

注意到 \(k\) 单调不降,使用单调队列进行维护。

#include <bits/stdc++.h>
#define rep(i, l, r) for (ll i = (l); i <= (r); i++)
#define per(i, r, l) for (ll i = (r); i >= (l); i--)
using namespace std;
typedef long long ll;

struct Point {
    ll x, y;
    Point(ll x = 0, ll y = 0) : x(x), y(y) {}
};
long double slope(Point &A, Point &B) {
    return (long double)(B.y - A.y) / (B.x - A.x);
}

const int MAXN = 3e5;
const ll INF = 1e18;

ll n, A, B, W;
ll D[MAXN];

ll f[MAXN];
ll P(ll x) {
    return x * (x - 1) / 2 * B - A * x + A + D[x];
}
ll Q(ll x) {
    return f[x] + x * (x + 1) / 2 * B + A * x;
}

int main() { ios::sync_with_stdio(0); cin.tie(0);
    freopen("chips.in", "r", stdin);
    freopen("chips.out", "w", stdout);
    cin >> n >> A >> B >> W;
    rep(i, 1, n)
        cin >> D[i];

    deque<Point> dq;
    f[0] = W;
    dq.push_back(Point(0, Q(0)));
    rep(i, 1, n+1) {
        ll k = B * i;
        while (int(dq.size()) >= 2 && slope(dq[0], dq[1]) < k)
            dq.pop_front();
        auto [x, y] = dq.front();
        f[i] = y - k * x;
        f[i] += P(i);
        auto p = Point(i, Q(i));
        while (int(dq.size()) >= 2 && (slope(dq[dq.size()-2], dq.back()) >= slope(dq.back(), p)))
            dq.pop_back();
        dq.push_back(p);
    }
    cout << f[n+1] << '\n';
    return 0;
}

标签:right,frac,薯片,ll,笔记,times,斜率,优化,dq
From: https://www.cnblogs.com/AugustLight/p/18548626

相关文章

  • 【跟着阿舜学音乐-笔记】1.11和弦的表现形式
    和弦的分配在音乐演奏中,和弦会有纵向和横向两种分配形式。和弦最低的音铺垫了整体和弦宏观色彩与基调,一般词用和弦的根音,但并不一定。同时最低的音通常要与上方的音有一定距离,一般是大于等于五度,具体也和音区有关。所谓和声铺底,就是铺设主要和弦音的区域,一般采取1~2件乐器。......
  • 如何通过集成化平台优化企业业务流程,减少低效环节
    在企业管理中,优化业务流程是提升效率和减少成本的关键手段。低效的业务流程不仅会降低企业的整体生产力,还可能导致资源浪费、客户体验下降以及错失市场机会。本文将探讨企业业务流程中的常见低效环节、它们产生的原因,以及如何通过优化和现代化技术手段,尤其是集成化流程管理平台......
  • 多种智能优化算法优化正则化极限机器学习机(RELM)的数据回归预测
     正则化极限学习机(RELM)通过引入正则化项来约束模型复杂度,从而提高模型的泛化能力。然而,优化RELM的最优权值(即隐藏层到输出层的权重)仍然是提升其性能的关键。通过多种智能优化算法来优化RELM的最优权值,可以显著提升其在数据回归预测任务中的性能。以下是相关过程的基本原理和示......
  • 生产环境中AI调用的优化:AI网关高价值应用实践
    随着越来越多的组织将生成式AI引入生产环境,他们面临的挑战已经超出了初步实施的范畴。如果管理不当,扩展性限制、安全漏洞和性能瓶颈可能会阻碍AI应用的推广。实际问题如用户数据的安全性、固定容量限制、成本管理和延迟优化等,需要创新的解决方案。本文我们深入探讨了一些独特的应......
  • 【深度学习目标检测|YOLO算法5-2-3】YOLO家族进化史:从YOLOv1到YOLOv11的架构创新、性
    【深度学习目标检测|YOLO算法5-2-3】YOLO家族进化史:从YOLOv1到YOLOv11的架构创新、性能优化与行业应用全解析…【深度学习目标检测|YOLO算法5-2-3】YOLO家族进化史:从YOLOv1到YOLOv11的架构创新、性能优化与行业应用全解析…文章目录【深度学习目标检测|YOLO算法5-2-3......
  • Linux编程:基于 Unix Domain Socket 的进程/线程间通信实时性优化
    文章目录0.引言1.使用`epoll`边缘触发模式非不要不选择阻塞模式边缘触发(ET)模式优点示例2.使用实时调度策略3.CPU绑定4.使用无锁缓冲区5.优化消息传递的大小和频率6.使用`SO_RCVTIMEO`和`SO_SNDTIMEO`7.示例代码其他阅读0.引言前几天被问到“如何优......
  • C语言经典100题 学习笔记(更新中)
    第一题:有1、2、3、4四个数字,能组成多少互不相同且无重复数字的三位数?都是多少?#include<stdio.h>//有1、2、3、4四个数字//能组成多少互不相同且无重复数字的三位数?都是多少?intmain01(){ inta=0; intb=0; intc=0; intcount=0; for(a=1;a<5;a++) {......
  • 【Python学习笔记】 第10章 Python语句简介
    重温Python的知识结构程序由模块组成。模块包含语句。语句包含表达式。表达式创建并处理对象。从基础上看,Python编写的程序实际上时由语句和表达式构成的。表达式用于处理对象,并被嵌入到语句中。语句使用并引导表达式处理我们前几章所学的对象。语句可以创建对象。Python......
  • 若依笔记(十一):芋道多租户限制与修改
    目录多租户实现哪些表是多租户的?YudaoTenant自动装载类租户隔离的sql在哪?如何修改成无租户隔离全局修改表级别请求RUL级别芋道比若依多了租户概念,这也是因为它增加很多业务系统,首先后台管理系统肯定是多租户的,这意味着如商城系统的产品管理SPU、库存管理SKU都可以是......
  • 代理模式在JavaScript中的恋爱应用笔记
    一、引言在面向对象编程的世界里,代理模式犹如一位巧妙的媒人,巧妙地连接了两个对象之间的交互,而无需直接显式地引用彼此。这种模式不仅降低了系统的耦合度,还使得代码更加灵活、可扩展。而在JavaScript的世界里,代理模式更是展现出了其独特的魅力。今天,我将结合恋爱场景,为大家......