题面

​ 最近在搞dp, 发现自己的dp还是太弱了, 做的题比较少, 也有一些东西没学, 这道题算是我独立做的第一道斜率优化dp, 写篇题解纪念一下吧.

​ dp式比较简单, 就是一个线性的dp, 设\(f[i]\)为将1 ~ i分为若干个集合所花费的最小值, \(c[i]\)为1 ~ i的\(c\)值的前缀和, 对于满足\(j\)小于\(i\)的\(j\), 则有:
\[ f[i] = min(f[j] + (c[i] - c[j] + i - j - 1 - l)^2)\tag{1} \]
设\(a[i] = c[i] + i\), \(b[i] = c[i] + i + 1 + l\), 则可将上式化简为下式:
\[ \begin{aligned} f[i] = & min(f[j] + (a[i] - b[j])^2)\\ =&min(f[j] + a[i] ^ 2 + b[j] ^ 2 - 2 * a[i] * b[j]) \end{aligned} \]
假设对于某个\(k\)(\(k\) >\(j\)), 选\(k\)比选\(j\)更优, 则有下式:
\[ \begin{aligned} f[k] + a[i] ^ 2 + b[k] ^ 2 - 2 * a[i] * b[k] &< f[j] + a[i] ^ 2 + b[j] ^ 2 - 2 * a[i] * b[j]\\ (f[k] + b[k] ^ 2) - (f[j] + b[j] ^ 2) &< 2 * a[i] * (b[k] - b[j])\\ \frac{(f[k] + b[k] ^ 2) - (f[j] + b[j] ^ 2)}{2 * (b[k] - b[j])} &< a[i] \end{aligned} \]
对于上述几个不等式, 由于\(c[i]\)与\(i\)单调递增, 所以\(a[i]\)也是单调递增的, 那么对于平面上的任意三个决策点\(j_1\), \(j_2\), \(j_3\), 若\(j_2\)对\(i\)最优, 则\((b[j_1], f[j_1] + b[j _ 1] ^ 2)\), \((b[j_2], f[j_2] + b[j _ 2]^2)\), \((b[j_3], f[j _ 3] + b[j _ 3] ^ 2)\)三点应该满足下列两个等式:
\[ \begin{aligned} \frac{(f[j_2] + b[j_2] ^ 2) - (f[j _ 1] + b[j _ 1] ^ 2)}{2 * (b[j_2] - b[j _ 1])} &< a[i]\\ \frac{(f[j_3] + b[j_3] ^ 2) - (f[j _ 2] + b[j _ 2] ^ 2)}{2 * (b[j_3] - b[j _ 2])} &\geq a[i]\\ \end{aligned} \]
所以有:
\[ \frac{(f[j_3] + b[j_3] ^ 2) - (f[j _ 2] + b[j _ 2] ^ 2)}{2 * (b[j_3] - b[j _ 2])} >\frac{(f[j_2] + b[j_2] ^ 2) - (f[j _ 1] + b[j _ 1] ^ 2)}{2 * (b[j_2] - b[j _ 1])} \]
也就是斜率单调上升, 故维护一个下凸包即可, 注意单调队列初始化时要先加入一个0.

代码

#include <iostream>
#include <cstring>
#include <cstdio>
#define N 50005
#define int long long
using namespace std;int n, L, sum[N], a[N], b[N], f[N], q[N], l = 1, r; inline int read()
{int x = 0, w = 1;char c = getchar();while(c < '0' || c > '9') { if (c == '-') w = -1; c = getchar(); }while(c >= '0' && c <= '9') { x = x * 10 + c - '0'; c = getchar(); }return x * w;
}bool F_check(int x, int y, int z) { return f[y] - f[x] + b[y] * b[y] - b[x] * b[x] < 2 * z * (b[y] - b[x]); }bool S_check(int x, int y, int z)
{return (f[y] - f[x] + b[y] * b[y] - b[x] * b[x]) * (b[z] - b[y]) > (f[z] - f[y] + b[z] * b[z] - b[y] * b[y]) * (b[y] - b[x]);
}signed main()
{n = read(); L = read(); for(int i = 1; i <= n; i++){sum[i] = read(); sum[i] += sum[i - 1];a[i] = sum[i] + i; b[i] = sum[i] + i + L + 1; }memset(f, 0x3f, sizeof(f));b[0] = L + 1; f[0] = 0;q[++r] = 0; for(int i = 1; i <= n; i++){while(l < r && F_check(q[l], q[l + 1], a[i])) l++;f[i] = f[q[l]] + a[i] * a[i] + b[q[l]] * b[q[l]] - 2 * a[i] * b[q[l]];while(l < r && S_check(q[r - 1], q[r], i)) --r;q[++r] = i; }printf("%lld\n", f[n]); return 0;
}
\\有一些数组的名字改动了一点点, 世上不是缺少不一样的东西, 而是缺少发现不一样的东西的眼睛

你觉得我会告诉你我在写题目之前就把题解写完了吗???

转载于:https://www.cnblogs.com/ztlztl/p/10616538.html

[luogu3198] 玩具装箱相关推荐

  1. 『玩具装箱TOY 斜率优化DP』

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

  2. [HNOI2008]玩具装箱toy

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 10286  Solved: 4215 [Submit] ...

  3. 【BZOJ1010】【HNOI2008】玩具装箱(斜率优化,动态规划)

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

  4. bzoj 1010: [HNOI2008]玩具装箱toy 2011-12-27

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 2254  Solved: 744 [Submit][S ...

  5. 1010 [HNOI2008]玩具装箱toy

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MB Description P教授要去看奥运,但是他舍不下他的玩具,于是他决 ...

  6. 【决策单调性】玩具装箱(金牌导航 决策单调性优化DP-1)

    玩具装箱 金牌导航 决策单调性优化DP-1 题目大意 给出若干个物品,把iii到jjj个物品装在一起的长度l=j−i+∑k=ijakl=j-i+\sum_{k=i}^{j}a_kl=j−i+∑k=ij ...

  7. 【斜率优化】玩具装箱(luogu 3195)

    玩具装箱 luogu 3195 题目大意 有n件物品,每件物品有相对的长度CiC_iCi​现在要把这n件物品放到容器中,切放的物品必须是连续的,若把第i件物品到第j件物品放到一个容器中,那此容器的长度 ...

  8. P3195 [HNOI2008]玩具装箱TOY

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

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

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

最新文章

  1. 给你一天时间,如何理清AI圈儿现状?
  2. 微服务架构 — 设计原则
  3. 从未这么明白的设计模式(一):单例模式
  4. tkinter笔记:画布canvas
  5. Redis整合Spring结合使用缓存实例
  6. php this指针的用法,C#_C#中this指针的用法示例,本文实例展示了C#中this指针的 - phpStudy...
  7. scrape创建_确实在2分钟内对Scrape公司进行了评论和评分
  8. 【Git】GitHub无法解析Latex语句的解决方法
  9. aix升级openssh_AIX6.1上源码编译升级openssh6.6p1
  10. MIS(管理信息系统)
  11. 腾讯轻量云FREEBSD11.1安装panabit cloud
  12. Docker——数据卷的概述和使用
  13. 30个最常见oCPC问题
  14. 【分布式】分布式系统概述
  15. Spark—15分钟教程
  16. ubuntu卷组安装
  17. C语言程序设计教程 北京邮电,C语言程序设计教程(第3版)/ 杨路明 9787563543403 北京邮电...
  18. FL studio 20中那些“花里胡哨”的效果器(三)
  19. Tableau 表计算函数
  20. C语言大数相乘(整形)

热门文章

  1. 用JS实现一个随机点名系统(五)
  2. 现外供电电压都达240V,音响系统要不要加稳压器?
  3. 小腿肌肉该怎么练?有哪些训练动作?
  4. 如何快速解决腿抽筋?
  5. 腾讯不允许将会员借给别人用,大家怎么看?
  6. Merkle Patricia Tree 详解
  7. Qt4_使用窗体编辑记录
  8. vscode 使用flask
  9. 计算机网络class 3(速率的相关性能指标)
  10. t–sql pl–sql_SQL Server –在T-SQL中使用最低的度量单位