状态定义很简单,
然后经过一堆花里胡哨的运算,就可以算出方程
f[j]-sum[j]+a[j+1]*j = a[j+1]*i-sum[i]+f[i]
y(j) = f[j]-sum[j]+a[j+1]*j

然后经过一堆花里胡哨的证明就可以发现y(j), i, sum[i]都是单增的,然后就可以找出斜率优化的两个条件之一,
更优解比较
(y(q[l + 1]) - y(q[l])) <=i * (a[q[l + 1] + 1] - a[q[l] + 1])
(通过解方程:f[i] (从q[l+1]转移) <= f[i] (从q[l]转移)的方程得出)

斜率单调的比较
(a[now + 1] - a[q[r] + 1])(y(q[r]) - y(q[r - 1])) >=(a[q[r] + 1] - a[q[r - 1] + 1])(y(now) - y(q[r]))

最后是代码

#include <cstdio>
#include <iostream>
#include <iomanip>
#include <string>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <map>
#include <algorithm>
#include <cmath>
#include <stack>#define INF 0x3f3f3f3f
#define IMAX 2147483646
#define LINF 0x3f3f3f3f3f3f3f3f
#define ll long long
#define ull unsigned long long
#define uint unsigned intusing namespace::std;const int maxn = 211111;ll a[511111], sum[511111], n, k, t;
ll f[511111], now, q[511111], l, r;
#define y(j) (f[j] + a[j + 1] * j - sum[j])int main() {scanf("%lld", &t);while (t--) {scanf("%lld%lld", &n, &k);for (int i = 1; i <= n; i++)scanf("%lld", a + i), sum[i] = sum[i - 1] + a[i];l = r = 1;q[1] = k;for (int i = k; i <= n; i++) {if (i < k * 2) { f[i] = sum[i] - i * a[1]; continue; }while (l < r && (y(q[l + 1]) - y(q[l])) <=i * (a[q[l + 1] + 1] - a[q[l] + 1]))l++;f[i] = f[q[l]] + sum[i] - sum[q[l]] - a[q[l] + 1] * (i - q[l]);now = i - k + 1;while (l < r && (a[now + 1] - a[q[r] + 1])*(y(q[r]) - y(q[r - 1])) >=(a[q[r] + 1] - a[q[r - 1] + 1])*(y(now) - y(q[r])))r--;q[++r] = now;}printf("%lld\n", f[n]);}
}

poj 3709 斜率优化相关推荐

  1. poj 1180 斜率优化dp

    这个题目要是顺着dp的话很难做,但是倒着推就很容易退出比较简单的关系式了. dp[i]=min(dp[u]+(sum[u-1]-sum[i-1]+s)*f[i]);dp[i]代表从i到结尾需要花费的代 ...

  2. [POJ 3709] K-Anonymous Sequence(斜率优化dp / 动态维护凸包)

    K-Anonymous Sequence 看了两年前自己的博客,真的好青涩,连 markdown 都不太会用. 确实观赏感不是很好. 学习真的是慢慢积累的过程,以前感觉理解很困难的事,随着知识的增长, ...

  3. POJ 2018 Best Cow Fences (二分答案构造新权值 or 斜率优化)

    $ POJ~2018~Best~Cow~ Fences $(二分答案构造新权值) $ solution: $ 题目大意: 给定正整数数列 $ A $ ,求一个平均数最大的长度不小于 $ L $ 的子段 ...

  4. 动态规划优化_斜率优化

    先来看一道题(HDU3507): 题意:给出N个单词,每个单词有个非负权值Ci,将k个单词排在一行的费用为(∑Ci)^2+M.求最优方案,使得总费用最小. 我们很容易得到一个O(N^2)的算法: s[ ...

  5. 逊哥dp专题 总结(普通dp,斜率优化dp,数位dp)

    dp真是博大精深,本渣自叹智商不足,但是就算是不足也要拼死一搏,怒燃之 poj 3934 题意:给你n个身高都不同的人,然后排队,如果两人之间的所有人都比他们俩矮,那么他们俩可以互相看见,问你如果要正 ...

  6. BZOJ1597: [Usaco2008 Mar]土地购买(dp 斜率优化)

    题意 题目链接 Sol 重新看了一遍斜率优化,感觉又有了一些新的认识. 首先把土地按照\((w, h)\)排序,用单调栈处理出每个位置第向左第一个比他大的位置,显然这中间的元素是没用的 设\(f[i] ...

  7. BZOJ 1597: [Usaco2008 Mar]土地购买( dp + 斜率优化 )

    既然每块都要买, 那么一块土地被另一块包含就可以不考虑. 先按长排序, 去掉不考虑的土地, 剩下的土地长x递增, 宽y递减 dp(v) = min{ dp(p)+xv*yp+1 } 假设dp(v)由i ...

  8. 【BZOJ3963】[WF2011]MachineWorks cdq分治+斜率优化

    [BZOJ3963][WF2011]MachineWorks Description 你是任意性复杂机器公司(Arbitrarily Complex Machines, ACM)的经理,公司使用更加先 ...

  9. BZOJ 1492: [NOI2007]货币兑换Cash [CDQ分治 斜率优化DP]

    传送门 题意:不想写... 扔链接就跑 好吧我回来了 首先发现每次兑换一定是全部兑换,因为你兑换说明有利可图,是为了后面的某一天两种卷的汇率差别明显而兑换 那么一定拿全利啊,一定比多天的组合好 $f[ ...

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

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

最新文章

  1. oracle分页排序
  2. elasticsearch 运行原理
  3. 一个简单的记事本程序
  4. 数据结构课程设计 迷宫问题
  5. Python 16进制与字符串的转换、二进制 to 十进制、十六进制 to 十进制、十进制 to 二进制
  6. 阿里创业员工分享公司的BI选型之路!自研、开源的坑都踩过
  7. 在CentOS6和CentOS7安装epel仓库-最简单的方法
  8. python编程入门书籍-编程小白的第一本 Python 入门书
  9. Netflix Ribbon 负载均衡 概述 与 基本使用
  10. 两直线平行交叉相乘_初中数学几何公式、定理梳理,太全了!老师都转发了!...
  11. 传智播客C++学院教学总监朱景尧老师
  12. 前后端分离框架Vue+Element UI(上集)
  13. Mac上添加自己/公司的网络服务器盘
  14. 刀具半径补偿 c语言,C语言程序实现数控加工刀具半径补偿原理与坐标计算.pdf...
  15. 360度不停旋转动画demo效果示例(整理)
  16. SQL查询表结构相同的两张表中数据的差异
  17. 思考“手绘家谱”的算法
  18. git pull 出现 from the remote, but no such ref was fetched 已解决
  19. iscsi 远程连接磁盘
  20. 基于H5 小程序 UI框架选型 2020年9月10号

热门文章

  1. VScode自动格式化代码减少build时的问题
  2. 计算机Word更改表格中,教你修改Word文本表格
  3. 微信如何html动图文件,微信里的gif动态图片如何导出保存出来?看完本文你就知道了...
  4. 学好Python能做什么 python就业方向有哪些
  5. C语言-概念-文件指针
  6. delphi关于try的正确句法结构
  7. android 自定义快捷键,Android Studio中常用设置与快捷键
  8. SQL server 删除注册表
  9. CNN手写汉字识别参数调整
  10. 深度测评:学习商业数据分析,贪心科技AI到底靠谱么?