hdu3507 print ariticle 斜率优化入门题

一个人要用n\((0\le n\le 500005)\)个单词打一篇文章。一个单词有一个价值\(C_i\),一个文章可以分成若干段,每一段消耗价值\((\sum_{i=1}^kC_i)^2+M\),其中M是常数。问如何安排单词打法,使得消耗的价值最小?

  首先,dp方程是\(dp[i]=dp[j]+M+(sum[i]-sum[j])^2\)。

  但是,暴力转移是\(O(n^2)\)的。单调队列优化也用不了,因为dp方程内还有与i*j相关的项。咋办呢?当然是用斜率优化了!(什么鬼)

  来转换一下dp方程。假设目前dp的是i,j,k是能转移到i的阶段。如果从j转移比从k更优,说明:\(dp[j]+M+(sum[i]-sum[j])^2<dp[k]+M+(sum[i]-sum[k])^2\)。

  推一下式子,可以推成\(dp[i]-dp[k]+2sum[i]sum[k]-2sum[i]sum[j]+sum[j]^2-sum[k]^2<0\)。为了不改变不等式的符号,我们让\(sum[j]>sum[k]\)。那么把式子除上\(2(sum[j]-sum[k])\),得到:\(\frac{dp[j]+sum[j]^2-(dp[k]+sum[k]^2)}{2(sum[j]-sum[k])}<sum[i]\),拿x和y数组代一下,\(\frac{y[j]-y[k]}{x[j]-x[k]}<sum[i]\ \ \ (x[j]-x[k]>0)\)。

  现在我们来边缘op。首先,x[j]和y[j]都只和j本身有关,与转移无关。\(\frac{y[j]-y[k]}{x[j]-x[k]}<sum[i]\)中,我们发现只有sum[i]和i有关。我们成功分离出了与i有关的项!同时\(\frac{y[j]-y[k]}{x[j]-x[k]}\)很像斜率的表示,所以试着把所有\((x[j], y[j])\)画到坐标系上:

  

  对于一个点,它左上角的所有点,无论如何都会比它劣(边的斜率为负),同理,在它右下角的所有点,无论如何都会比它优。其它位置的点则不一定。因此,只有半下凸包上的点有可能是最优点。

  所以在转移过程中,我们要动态维护一个下凸包。每次决策的时候,在凸包上面二分就行了。

  但是!这道题很神奇。它满足决策单调性,并且新加入的点一定在所有点的右边。所以你既不用动态维护下凸包,也不用在凸包上面二分。用单调队列就行啦!

  看似这道题做完了,然而还有个坑点:\(c_i\)可能是0…这说明可能有多个点的x下标相同,甚至有可能多个点重合!当有多个点的x下标相同时,\(x[j]-x[k]=0\),也就是说如果你算斜率会被零除,然后光荣RE。所以计算斜率应该乘出来,避免这种情况。而当有多个点重合时,\(y[j]-y[k]=0<sum[i]\),也就是队列不会往前推。然而重合点不一定是最好的。所以在写程序的时候应该是小于等于。记住开始的式子\(dp[i]=dp[j]+M+(sum[i]-sum[j])^2\),斜率式是我们推出来的,只不过方便计算,还有一些情况被漏掉了!

#include <cstdio>
using namespace std;const int maxn=5e5+5;
int n, m, h, t, sum[maxn];
int dp[maxn], x[maxn], y[maxn], q[maxn];
inline int sqr(int x){ return x*x; }int main(){while (~scanf("%d%d", &n, &m)){for (int i=1; i<=n; ++i) scanf("%d", &sum[i]);for (int i=2; i<=n; ++i) sum[i]+=sum[i-1];sum[0]=h=t=dp[0]=x[0]=y[0]=0;for (int i=1; i<=n; ++i){while (h<t&&y[q[h+1]]-y[q[h]]<=sum[i]*(x[q[h+1]]-x[q[h]])) ++h;dp[i]=dp[q[h]]+m+sqr(sum[i]-sum[q[h]]);x[i]=2*sum[i], y[i]=dp[i]+sqr(sum[i]);while (h<t&&(y[i]-y[q[t]])*(x[q[t]]-x[q[t-1]])<=(y[q[t]]-y[q[t-1]])*(x[i]-x[q[t]])) --t;q[++t]=i;}printf("%d\n", dp[n]);}return 0;
}

  看完记得点个赞!

转载于:https://www.cnblogs.com/MyNameIsPc/p/7611156.html

hdu3507 print article相关推荐

  1. HDU3507 Print Article —— 斜率优化DP

    题目链接:https://vjudge.net/problem/HDU-3507 Print Article Time Limit: 9000/3000 MS (Java/Others)    Mem ...

  2. HDU3507 Print Article(斜率优化dp)

    前几天做多校,知道了这世界上存在dp的优化这样的说法,了解了四边形优化dp,所以今天顺带做一道典型的斜率优化,在百度打斜率优化dp,首先弹出来的就是下面这个网址:http://www.cnblogs. ...

  3. HDU 3507:Print Article

    HDU 3507:Print Article 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3507 题目大意:给定$n$,$m$,输出序列$n$个数, ...

  4. C++剑指offer:解题报告之DP优化学习记 (二) ——浅论DP斜率优化 (Print Article 【HDU - 3507】 )

    链接:https://share.weiyun.com/5LzbzAc 目录 前言 斜率优化前期准备 1.从状态转移方程出发 2.推理状态转移方程 对结论的进一步推导 干货!综合结论 判断斜率大小的方 ...

  5. HDU 3507 Print Article(斜率优化DP)

    题目链接 题意 : 一篇文章有n个单词,如果每行打印k个单词,那这行的花费是,问你怎么安排能够得到最小花费,输出最小花费. 思路 : 一开始想的简单了以为是背包,后来才知道是斜率优化DP,然后看了网上 ...

  6. hdu 3507 Print Article(dp+斜率优化)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3507 题解:显然这题的递推很容易得到 dp[i]=dp[j]+(sum[i]-sum[j])^2+m ...

  7. HDU 3507 Print Article(单调队列)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3507 题意:给出一个数列C,一个数字M,将数列分成若干段,每段的代价为(设这段的数字为k个): 求一种 ...

  8. HDU 4825:Print Article(01字典树)

    Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others) Total ...

  9. 提高篇 第五部分 动态规划 第6章 斜率优化动态规划

    例1 任务安排(TYVJ1098) [tyvj1098]任务安排(dp)_薇小薇-CSDN博客 Tyvj1098 任务安排_Monster__Yi的博客-CSDN博客 P2365 任务安排 任务安排 ...

最新文章

  1. linux 远程 telnet
  2. Spring Cloud Feign的文件上传实现
  3. 58到家MySQL军规升级版(转:2018-03-30 58到家DBA 架构师之路)
  4. 第24日:实施质量保证 和 组建项目团队
  5. 新建文章1,改名后按回车
  6. iOS中常见的内存问题
  7. 教学思路C#之入门一 认识简单的C#结构
  8. 《C++ Primer Plus(第六版)》(25)(第十三章 类继承 笔记)
  9. 阿里测试环境运维及研发效率提升之道
  10. web 自动化测试 selenium基础到应用(目录)
  11. Mysql索引之-cardinality
  12. 最新Linux系统安装腾讯QQ教程(非Wine)
  13. 苹果7信号天线内部位置_苹果手机的天线在什么位置
  14. 为什么是NoSQL数据库?
  15. 无线信道仿真 matlab,基于Matlab的无线信道仿真.doc
  16. 网络显示404是怎么回事?
  17. 【附源码】Python计算机毕业设计码码科技公司招投标管理系统
  18. 如何注销Facebook账户
  19. 联邦学习-论文阅读-Incentive Mechanism for Reliable Federated Learning: A Joint Optimization Approach to Comb
  20. dropbear编译安装与使用

热门文章

  1. 修改telnet提示并非_热血传奇:老玩家揭秘!这4个地方都被盛大修改过,第3个80%都想不到...
  2. vue element Form-Item prop
  3. click Utilities
  4. 编程通用知识 字符编码(ascii,unicode,utf-8)
  5. go语言 panic
  6. Vue.js 入门案例
  7. 1.8 其他正则化方法
  8. Numpy Statistics 统计函数
  9. C++语言动态内存管理介绍和示例
  10. arm跑操作系统的意义_不太远的猜想:当ARM和鸿蒙OS在笔记本领域相遇,颠覆已无可避免...