前置知识:单调队列(一般情况下)、一次函数、前缀和(例题)。

关于

斜率优化一般解决这样的问题:

\[dp_i = \min \{ dp_j + f(i, j) \}
\]

当然这种也算:

\[dp_i = \max \{ dp_j + f(i, j) \}
\]

例题

链接是这个:跳转到洛谷

题目大意:将一段数组分段,每段的代价是 \((j - i + \sum_{k=i}^j{c_k} - L) ^2\),求分段代价合的最小值。

第一次变形

令前缀和数组为 \(s\),即:\(s_i = \sum_1^i{c_k}\),则:\(\sum_{k=i}^j{c_k} = sum_j - sum_{i - 1}\)。

令:\(m = L + 1\)。

则:\(dp_i = \min \{ dp_j + (i - j + s_i - s_j +m) \}\)。

继续令:\(a_i = i + s_i\)。

则:\(dp_i = \min \{ dp_j + (a_i - a_j - m)^2 \}\)。

就是上面关于所提到的类似的式子。

弱版的话直接这样暴力 DP \(O(n^2)\) 就能过。

第二次变形

解决:\(dp_i = \min \{ dp_j + (a_i - a_j - m)^2 \}\) 的问题。

假设存在更优解 \(j\) 且 \(j\) 小于当前最优值 \(k\),即:\(j < k\).

那么很容易得到:\(dp_j + (a_i - a_j - m)^2 \le dp_k + (a_i - a_k - m)^2\)。

化解移项(过程略)后得到的结果:

\[(dp_j + a_j ^ 2) - (dp_k - a_k^2) \le 2(a_i - m)(a_j - k)
\]

令:\(f(i) = dp_i + a_i^2\),可得:

\[\frac{f(j) - f(k)}{a_j - a_k} \le 2(a_i - m)
\]

斜率具有单调性,使用单调队列优化即可。

代码

#include <bits/stdc++.h>
#define GCC optimize("Ofast", "-funroll-all-loops")
#pragma GCC target("popcnt") #define int long long #define rep(x, a, b) for (auto x = a; x <= b; x++)
#define rpl(x, a, b) for (auto x = a; x < b; x++)
#define per(x, a, b) for (auto x = a; x >= b; x--) using namespace std; #define pii pair<int, int>
#define x first
#define y second const int N = 5e4 + 10;
int n, m, a[N], b[N], s[N], dp[N];
deque<int> q; int f(int x) { return dp[x] + a[x] * a[x]; }
double slope(int x, int y) { return (double)(f(x) - f(y)) / (a[x] - a[y]); } signed main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr); cin >> n >> m;
m ++; rep(i, 1, n) cin >> s[i];
rep(i, 2, n) s[i] += s[i - 1];
rep(i, 1, n) a[i] = s[i] + i; q.push_back(0);
rep(i, 1, n) {
while (q.size() > 1 && slope(q[0], q[1]) <= 2 * (a[i] - m)) q.pop_front();
dp[i] = dp[q[0]] + (a[i] - a[q[0]] - m) * (a[i] - a[q[0]] - m);
while (q.size() > 1 && slope(q[q.size() - 2], q.back()) > slope(i, q.back())) q.pop_back(); q.push_back(i);
} cout << dp[n] << endl;
return 0;
}

斜率优化 DP 解析([HNOI2008] 玩具装箱 题解)的更多相关文章

  1. 【斜率优化】BZOJ1010 [HNOI2008]玩具装箱toy

    [题目大意] P教授有编号为1...N的N件玩具,第i件玩具长度为Ci.为了方便整理,P教授要求在一个一维容器中的玩具编号是连续的.如果将第i件玩具到第j个玩具放到一 个容器中,那么容器的长度将为 x ...

  2. BZOJ1010:[HNOI2008]玩具装箱——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1010 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行 ...

  3. BZOJ 3675 APIO2014 序列切割 斜率优化DP

    题意:链接 方法:斜率优化DP 解析:这题BZ的数据我也是跪了,特意去网上找到当年的数据后面二十个最大的点都过了.就是过不了BZ. 看到这道题自己第一发DP是这么推得: 设f[i][j]是第j次分第i ...

  4. BZOJ 1010: [HNOI2008]玩具装箱toy 斜率优化DP

    1010: [HNOI2008]玩具装箱toy Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再 ...

  5. BZOJ 1010: [HNOI2008]玩具装箱toy [DP 斜率优化]

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 9812  Solved: 3978[Submit][St ...

  6. bzoj 1010 [HNOI2008]玩具装箱toy(DP的斜率优化)

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 7874  Solved: 3047[Submit][St ...

  7. bzoj1010[HNOI2008]玩具装箱toy 斜率优化dp

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 11893  Solved: 5061[Submit][S ...

  8. [HNOI2008]玩具装箱TOY --- DP + 斜率优化 / 决策单调性

    [HNOI2008]玩具装箱TOY 题目描述: P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京. 他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器 ...

  9. BZOJ 1010: [HNOI2008]玩具装箱toy(DP+斜率优化)

    [HNOI2008]玩具装箱toy Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊 ...

  10. bzoj1010: [HNOI2008]玩具装箱toy(DP+斜率优化)

    1010: [HNOI2008]玩具装箱toy 题目:传送门 题解: 很明显的一题动态规划... f[i]表示1~i的最小花费 那么方程也是显而易见的:f[i]=min(f[j]+(sum[i]-su ...

随机推荐

  1. hashlib+time模块

    hashlib模块 [一]什么是摘要算法 Python的hashlib提供了常见的摘要算法 如MD5 SHA1等等. 摘要算法又称哈希算法.散列算法. 它通过一个函数,把任意长度的数据转换为一个长度固 ...

  2. Oracle故障处理:分析Oracle数据库离奇的多快读慢

    我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效 ...

  3. 3-6softmax回归从0开始实现

    3-6softmax回归从0开始实现 import torch from IPython import display from d2l import torch as d2l batch_size ...

  4. oracleINS-13001 环境不满足最低要求

    使用windows10等系统安装oracle 11g等版本的数据库时,经常会发现开始安装时弹出[INS-13001 环境不满足最低要求]的提示,此时可以点击[是]继续安装. 也可以点击[否]结束安装, ...

  5. 扩展若依@Excel注解,使其对字段的控制是否导出更加便捷

    基于若依框架实现按角色控制 Excel 字段导出功能 一.背景介绍 在我们的项目开发中,采用了若依(RuoYi)的 Java Spring 框架进行系统搭建.若依框架提供了 @Excel 注解,通过在 ...

  6. idea集成翻译插件

    在读开源代码时,英文注释看起来比较吃力,于是安装一个翻译插件第一步:安装TranslateHelper插件 配置 IDEA -> Preferences -> Plugins ,安装Tra ...

  7. Cascader 支持服务端搜索

    server-search-cascader 描述 vue3版本的级联选择器,支持懒加载和服务端搜索 如果您用的是react,原理一样,看代码修改即可 The cascade selector of ...

  8. 前端开发系列080-Node篇之cnpm

    本文输出Node中另一款包管理工具CNPM相关的内容,包括基本情况和简单使用. 一.简单介绍 CNPM是阿里的Node团队开发的一款NPM工具,由蚂蚁金服Node技术专家苏千(袁锋·Node技术专家) ...

  9. amr 数据格式

    参考文章 大牛博客

  10. POLIR-Organization-核心在"结网" 与 "人VS事VS财物": "共和度" 及 "层级"" 必须有适配的 "自主度" 作为保障: {权利组织、信任网络} + 信息{情报、系统对接、数据} + 资金链{借贷、担保、赊销} + 供应链{原材料、核心部件、物资、物流}

    POLIR-Organization-"共和度" 必须有适配的 "自主度" 作为保障: 核心在"结网" 与 "人事财物" ...