Description

题意:给N个数,按顺序全部取走,每次取一段连续的区间,代价为\((S[i]-S[j])^2+M\)

其中M为一个给定的常数,\(S[i]\)为前缀和

\(N\leq 500000\)

Solution

常规的方程:\(dp[i]=min\{dp[j]+(S[i]-S[j])^2+M\}, j<i\)

\(O(n^2)\)是过不了50万的,用斜率优化

设有\(k<j<i\) 使得决策j更优,那么有

\(dp[j]+(S[i]-S[j])^2+M<dp[k]+(S[i]-S[k])^2+M\)

整理得 \(\frac{(dp[j]+S[j]^2)-(dp[k]+S[k]^2)}{(S[j]-S[k])}<2*S[i]\)

令\(f[i]=dp[i]+S[i]^2\),所以有\(\frac{f[j]-f[k]}{s[j]-s[k]}<2*S[i]\)

此时决策j更优,反之决策k优

易证\(f[i]\)也单调递增,所以可用单调队列维护

Code

  1. #include <cstdio>
  2. #include <algorithm>
  3. #define N 500010
  4. #define squ(x) ((x)*(x))
  5. using namespace std;
  6. int n,M,l,r,q[N],s[N],dp[N];
  7. inline int read(){
  8. int x=0,f=1;char ch=getchar();
  9. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  10. while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
  11. return x*f;
  12. }
  13. inline int f(int k,int j){return dp[j]+squ(s[j])-(dp[k]+squ(s[k]));}
  14. inline int g(int k,int j){return s[j]-s[k];}
  15. void DP(){
  16. l=1,r=0;q[++r]=0;dp[0]=0;
  17. for(int i=1;i<=n;++i){
  18. while(l<r&&f(q[l],q[l+1])<=2*s[i]*g(q[l],q[l+1])) l++;
  19. int j=q[l];
  20. dp[i]=dp[j]+squ(s[i]-s[j])+M;
  21. while(l<r&&f(q[r],i)*g(q[r-1],q[r])<f(q[r-1],q[r])*g(q[r],i)) r--;//保证斜率单调
  22. q[++r]=i;
  23. }
  24. }
  25. int main(){
  26. while(~scanf("%d%d",&n,&M)){
  27. for(int i=1;i<=n;++i) s[i]=s[i-1]+read();
  28. DP();
  29. printf("%d\n",dp[n]);
  30. }
  31. return 0;
  32. }

[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入门题]

    Print Article Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)To ...

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

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

  4. [hdu3507 Print Article]斜率优化dp入门

    题意:需要打印n个正整数,1个数要么单独打印要么和前面一个数一起打印,1次打印1组数的代价为这组数的和的平方加上常数M.求最小代价. 思路:如果令dp[i]为打印前i个数的最小代价,那么有 dp[i] ...

  5. HDU3507 Print Article (斜率优化DP基础复习)

    pid=3507">传送门 大意:打印一篇文章,连续打印一堆字的花费是这一堆的和的平方加上一个常数M. 首先我们写出状态转移方程 :f[i]=f[j]+(sum[i]−sum[j])2 ...

  6. hdu3507 Print Article(斜率DP优化)

    Zero has an old printer that doesn't work well sometimes. As it is antique, he still like to use it ...

  7. HDU 3507 Print Article 斜率优化

    Print Article Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)To ...

  8. hdu 3507 Print Article(斜率优化DP)

    题目链接:hdu 3507 Print Article 题意: 每个字有一个值,现在让你分成k段打印,每段打印需要消耗的值用那个公式计算,现在让你求最小值 题解: 设dp[i]表示前i个字符需要消耗的 ...

  9. Print Article /// 斜率优化DP oj26302

    题目大意: 经典题 数学分析 G(a,b)<sum[i]时 a优于b G(a,b)<G(b,c)<sum[i]时 b必不为最优 #include <bits/stdc++.h& ...

  10. hdu 3507 Print Article —— 斜率优化DP

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=3507 设 f[i],则 f[i] = f[j] + (s[i]-s[j])*(s[i]-s[j]) + m ...

随机推荐

  1. 1 误删dbf文件造成ORA-01109: 数据库未打开.

    1.cmd-sqlplus /nolog-conn system/pwd as sysdba 2.shutdown immediate; 3.startup mount; 4.alter databa ...

  2. python基本数据类型,int,bool,str

    一丶python基本数据类型 1.int 整数,主要用来进行数学运算. 2.str 字符串,可以保存少量数据并进行相应的操作 3.bool 判断真假.True.False 4.list 存储大量数据, ...

  3. 【ros-kinetic iai_kinect2 opencv2 3 】注意事项

    iai_kinect2 :  https://github.com/code-iai/iai_kinect2/tree/master/kinect2_registration kinect2_brid ...

  4. uvm_reg_adapter——寄存器模型(十八)

    uvm_reg_adapter 功能就是在uvm_reg_bus_op和总线操作之间的转换.主要包含两个函数reg2bus 和bus2reg. //-------------------------- ...

  5. http头部信息学习

    想的每2周进行知识的总结,自己拖延症有犯了,发现自己知识库量还是太少,平时总结和发现问题还不够深,对待问题的深度也存在很多问题,但是坚持学习,总结,后面应该会有收获, 1.常见的返回码 100: 请服 ...

  6. python_9_for

    #1 for i in range(10):#默认从0开始,步长为1 print("loop",i) #2 for i in range(0,10,1):#步长为1 print(& ...

  7. 多线程:InterlockedIncrement

    1.InterlockedIncrement保护多线程中操作的整数. #include <stdio.h> #include <windows.h> volatile long ...

  8. IntelliJ IDEA中激活JRebel插件

    1. 下载激活软件:https://github.com/ilanyu/ReverseProxy/releases/tag/v1.0 我下载的是 2. 双击文件运行 3. 点击change licen ...

  9. Elastic Stack 安装

    Elastic Stack 是一套支持数据采集.存储.分析.并可视化全面的分析工具,简称 ELK(Elasticsearch,Logstash,Kibana)的缩写. 安装Elastic Stack ...

  10. Linux下 tomcat 的开机自启动设置

    每次开机都要启动tomcat,非常麻烦:通过直接修改系统文件,实现tomcat自启动: 1. 修改脚本文件rc.local:vim /etc/rc.d/rc.local 这个脚本是使用者自定的开机启动 ...