做完此题之后 自己应该算是真正理解了斜率优化DP

根据状态转移方程$f[i]=max(f[j]+ax^2+bx+c),x=sum[i]-sum[j]$

可以变形为 $f[i]=max((a*sum[j]^2-b*sum[j])-(2a*sum[j]*sum[i]))+(a*sum[i]^2+b*sum[i]+c)$

我们可以把每个决策映射到平面上的一个点

其中坐标$x=(a*sum[j]^2-b*sum[j])$代表此决策的固定价值(与转移到哪无关)

坐标$y=(-2a*sum[j])$代表此决策的潜在价值(与转移到哪有关)

这样我们就可以开始用单调队列维护一个$x$递增 $y$递减的凸壳

------------------------------------------------------------------------

对于每次加入进来的一个新元素

我们先对队首的两个决策进行判断 若某决策现有价值不如后面的决策则将其删去

(因为维护的单调队列中的决策潜在价值是递增的)

然后更新新加的元素的最大值

再对新加元素与队尾的两个决策间进行判断

如果队尾第一个的决策在新加决策和前面所有决策所构成凸壳之内

那么这个决策永远不可能同时优于前一个决策和新加决策 所以就直接删掉就好了

最后将新加的决策加入单调队列

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define rep(i,n) for(int i=1;i<=n;++i)
#define imax(x,y) (x>y?x:y)
#define imin(x,y) (x<y?x:y)
using namespace std;
const int N=1000010;
int sum[N],q[N];
long long f[N];
int n;
long long a,b,c;
long long solve(int x,int y)
{return f[x]+a*(sum[y]-sum[x])*(sum[y]-sum[x])+b*(sum[y]-sum[x])+c;
}
long long solvex(int x)
{return f[x]+a*sum[x]*sum[x]-b*sum[x];
}
bool judge(int x,int y,int z)
{long long tx=solvex(x),ty=solvex(y),tz=solvex(z);return (ty-tx)*(sum[z]-sum[x])<=(tz-tx)*(sum[y]-sum[x]);//约掉了-2a
}
int main()
{scanf("%d",&n);scanf("%lld%lld%lld",&a,&b,&c);rep(i,n){scanf("%d",&sum[i]);sum[i]+=sum[i-1];}int ifront=1,itail=1;q[1]=0;rep(i,n){while(ifront<itail&&solve(q[ifront],i)<=solve(q[ifront+1],i))++ifront;f[i]=solve(q[ifront],i);while(ifront<itail&&judge(q[itail-1],q[itail],i))--itail;q[++itail]=i;}printf("%lld",f[n]);return 0;
}

转载于:https://www.cnblogs.com/sagitta/p/4626683.html

APIO2010 特别行动队 斜率优化DP算法笔记相关推荐

  1. BZOJ 1911: [Apio2010]特别行动队 [斜率优化DP]

    1911: [Apio2010]特别行动队 Time Limit: 4 Sec  Memory Limit: 64 MB Submit: 4142  Solved: 1964 [Submit][Sta ...

  2. 【bzoj1911】[Apio2010]特别行动队 斜率优化dp

    题目描述 输入 输出 样例输入 4 -1 10 -20 2 2 3 4 样例输出 9 题解 斜率优化dp 设f[i]表示前i个士兵的战斗力之和的最大值. 那么有f[i]=f[j]+a*(sum[i]- ...

  3. [APIO2010]特别行动队——[斜率优化DP]

    [题目描述] 你有一支由 n 名预备役士兵组成的部队,士兵从 1 到 n 编号,要将他们拆分 成若干特别行动队调入战场.出于默契的考虑,同一支特别行动队中队员的编号 应该连续,即为形如(i,i+1,. ...

  4. 「APIO2010」 特别行动队 - 斜率优化Dp

    题目描述 你有一支由nnn名预备役士兵组成的部队,士兵从1到nnn编号,要将他们拆分成若干特别行动队调入战场.出于默契考虑,同一支特别行动队中队员的编号应该连续,即为形如(i,i+1,...,i+k) ...

  5. bzoj 1911: [Apio2010]特别行动队 -- 斜率优化

    1911: [Apio2010]特别行动队 Time Limit: 4 Sec  Memory Limit: 64 MB Description Input Output Sample Input 4 ...

  6. 特别行动队-斜率优化

    APIO2010特别行动队 令S为前缀和,那么n方DP: f[i]=max{f[i],f[j]+a*(S[i]-S[j])*(S[i]-S[j])+b*(S[i]-S[j])+c}; 展开,移项得到: ...

  7. BZOJ 2149 拆迁队 斜率优化DP 主席树

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2149 题目大意: 一个长度为 n n的序列aa,改变其中的某些数使之成为一个单调递增序列, ...

  8. 斜率优化dp学习笔记

    本文为原创??? 作者写这篇文章的时候刚刚初一毕业-- 如有错误请各位大佬指正 从例题入手 洛谷P3915[HNOI2008]玩具装箱toy Step0:读题 Q:暴力? 如果您学习过dp 不难推出d ...

  9. 特别行动队[斜率优化]

    传送门 首先考虑暴力的DP sum(i--j) 可以用前缀和维护 把式子拆开 ...是一坨常数,这里省略了 我们令 y=f[j]+a*s[j]*s[j]-b*s[j]  ,  x=s[j]  ,  k ...

最新文章

  1. 四川职业学校计算机专业那个好6,四川排名前六的单招学院那些专业比较好?
  2. JDK 14 / JEP 305模式匹配“ Smart Casts”实例
  3. linux kvm安装win7,详解在 KVM 上安装 Win7 虚拟机
  4. mercurial使用_DBA对Mercurial的介绍–什么时候以及为什么我们应该使用版本控制
  5. 基于多搜索引擎和深度学习技术的自动问答
  6. Andirod——网络连接(HttpURLConnection)
  7. 定期删除30天以前的elasticsearch的日志
  8. ASP.NET组件与开发之复合控件的事件处理
  9. 实例讲解遗传算法——基于遗传算法的自动组卷系统【实践篇】
  10. C++二叉树遍历递归算法
  11. pip cmd下载速度慢解决方案
  12. Unity3D AABB包围盒效果
  13. 利用手机模拟器进行apk抓包分析
  14. python命名规则数字开头的成语_day01 Python基础
  15. 【Block-Level Verification】 芯片开发通识_验证目标_ 验证语言_ 验证职业前景 _挑战和瓶颈_验证周期_功能描述文档_验证计划_回归测试_硅后测试_逃逸分析...
  16. 【※主题下载の命零电脑桌面主题※】
  17. (附源码)计算机毕业设计SSM旅游出行系统
  18. Relief特征提取算法实战
  19. m7y30处理器跑linux,vivoY30采用什么处理器-处理器性能如何
  20. 【proc】使用proc_create_data函数在proc下创建节点

热门文章

  1. ARM GCC Inline Assembler Cookbook
  2. Android 2.2
  3. 算了一挂,也不知准不准
  4. number of databases available at XJTLU
  5. what you want from a relationship?
  6. 有一个能够统一的方式来画uml图的软件
  7. 关于出去还是不出去的选择
  8. 挤牙膏机器,实话,没啥用
  9. .NET和UNITY版本问题
  10. WIN32下(非MFC)自编TRACE