HDU 3507:Print Article

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3507

题目大意:给定$n$,$m$,输出序列$n$个数,每连续输出代价为连续输出的数字和的平方加上$m$.

斜率优化DP

定义$sum_{pq}=\sum_{k=p+1}^qa_k=pre[q]-pre[p]$,其中$pre[]$维护的是前缀和.

直接DP:$dp[i]=min\{dp[q]+sum_{qi}+m\}(q<i)$,如此复杂度为$O(n^2)$,故需要优化.

设$p<q$,若从$q$转移而来比从$p$更优,则有$dp[q]+sum_{qi}+m<dp[p]+sum_{pi}+m$,

化简可得,$\frac{(dp[q]+pre[q]^2)-(dp[p]+pre[p]^2)}{2pre[q]-2pre[p]}<pre[i]$.

定义映射$f$,使得$k\xrightarrow{f} (2pre[k],dp[k]+pre[k]^2)$,$g[p,q]$为$f(p)$和$f(q)$两点的斜率,

则有,若$g[p,q]<pre[i]$,则$q$比$p$更优.

当$p<k<q$且$g[p,k]>g[k,q]$时,不难证明$k$一定不为最优:

当$g[k,q]<pre[i]$时,$q$比$k$更优;当$g[k,q]\geqslant pre[i]$时,有$g[p,k]>pre[i]$,故$p$比$k$更优.

考虑$pre[i]$数列的单调性,我们只需维护一个斜率递增的队列即可.

代码如下:

 1 #include <cstdio>
 2 #define N 500005
 3 using namespace std;
 4 typedef long long ll;
 5 int n,m,dp[N],a[N],pre[N],deq[N],r,f;
 6 int y(int n){return dp[n]+pre[n]*pre[n];}
 7 int x(int n){return 2*pre[n];}
 8 int main(void){
 9     while(~scanf("%d%d",&n,&m)){
10         r=-1,f=0;
11         deq[++r]=0;
12         for(int i=1;i<=n;++i){
13             scanf("%d",&a[i]);
14             pre[i]=pre[i-1]+a[i];
15         }
16         for(int i=1;i<=n;++i){
17             while(r-f>0){
18                 if(y(deq[f+1])-y(deq[f])
19                    <=pre[i]*(x(deq[f+1])-x(deq[f])))
20                     f++;
21                 else break;
22             }
23             dp[i]=dp[deq[f]]+(pre[i]-pre[deq[f]])*(pre[i]-pre[deq[f]])+m;
24             while(r-f>0){
25                 if((y(deq[r])-y(deq[r-1]))*(x(i)-x(deq[r]))
26                     >=(y(i)-y(deq[r]))*(x(deq[r])-x(deq[r-1])))
27                     r--;
28                 else break;
29             }
30             deq[++r]=i;
31         }
32         printf("%d\n",dp[n]);
33     }
34 }

转载于:https://www.cnblogs.com/barrier/p/6816390.html

HDU 3507:Print Article相关推荐

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

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

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

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

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

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

  4. Swift:print()vs println()vs NSLog()

    本文翻译自:Swift: print() vs println() vs NSLog() What's the difference between print , NSLog and println ...

  5. Perl的输出:print、say和printf、sprintf

    print.printf和say都可以输出信息.print和say类似,print不自带换行符,say自带换行符,但要使用say,必须写use语句use 5.010;,printf像C语言的print ...

  6. python打印字符金字塔_Python教程第7篇:print打印字符串

    经过我们前面的python环境安装,以及对编辑器的认识,今天我们总算是正式开启了我们的python代码之路了. 相信咱们很多小伙伴,都在咱们的部落窝教育课堂学过Excel函数.小编把Excel里面的函 ...

  7. 遇到的问题1:print时报错 can only concatenate str (not tuple) to str

    今天在学习python的时候,编写了如下代码: import cv2input_img = cv2.imread('1.jpg') cv2.imshow('input_one',input_img)# ...

  8. Python第一课:print()函数、变量与赋值

    Python第一课:print()函数.变量与赋值 所有的符号输入,必须是英文状态 一.print()函数的用法 单刀赴会:不带引号:数据 黄袍加身:单引号.双引号.三引号 单引号与双引号效果一致 当 ...

  9. Java算法_优先队列和PriorityQueue——HDU 1873:看病要排队

    目录 优先队列和PriorityQueue HDU 1873:看病要排队 java.util.Comparator 优先队列和PriorityQueue java.util.PriorityQueue ...

最新文章

  1. UIActivityViewController使用
  2. Aix6.1安装openssh
  3. css区块定位之浮动与清除属性
  4. vue-router query,parmas,meta传参
  5. MySQL存储过程相互调用
  6. Oracle中通过游标执行带参数的存储过程实现解析CLOB字段内的xml字符串:
  7. Qt的Xml操作QDomDocument
  8. python io多路复用_Python之IO多路复用
  9. QTP的那些事--XPath的重要使用
  10. 精通lambda表达式:java多核编程_Java8 Lambda表达式和流操作如何让你的代码变慢5倍...
  11. [转] Bound Service的三种方式(Binder、 Messenger、 AIDL)
  12. 一个缺陷管理系统数据库设计和界面设计分析
  13. Java高级工程师必备技术栈
  14. ubuntu linux运行exe文件,Linux Ubuntu 打开.exe文件
  15. 【洛谷】P1216数字三角形
  16. 电子元器件检测与维修从入门到精通视频教程
  17. [虾神GIS制图课堂]四色地图配色法
  18. iMazing安装教程 v2.11.7pjb
  19. 急先锋开宝箱问题(Java实现)
  20. App Store 审核必备

热门文章

  1. 拦截器与filter的区别
  2. (札记)Altera Stratix IV系列FPGA TRUE LVDS RX input termination 在Quartus工程中的设置方法...
  3. iOS下拉tableView实现上面的图片放大效果
  4. Tensorflow源码解析5 -- 图的边 - Tensor
  5. 清科-2018年中国金融科技领域10强
  6. Codeforces 997 C - Sky Full of Stars
  7. 删除字符串中出现次数最少的字符
  8. 【转载】有软件开发,就要有软件测试!
  9. Socket中的异常和参数设置
  10. [原创]Java性能优化权威指南读书思维导图