poj 3709 斜率优化
状态定义很简单,
然后经过一堆花里胡哨的运算,就可以算出方程
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 斜率优化相关推荐
- poj 1180 斜率优化dp
这个题目要是顺着dp的话很难做,但是倒着推就很容易退出比较简单的关系式了. dp[i]=min(dp[u]+(sum[u-1]-sum[i-1]+s)*f[i]);dp[i]代表从i到结尾需要花费的代 ...
- [POJ 3709] K-Anonymous Sequence(斜率优化dp / 动态维护凸包)
K-Anonymous Sequence 看了两年前自己的博客,真的好青涩,连 markdown 都不太会用. 确实观赏感不是很好. 学习真的是慢慢积累的过程,以前感觉理解很困难的事,随着知识的增长, ...
- POJ 2018 Best Cow Fences (二分答案构造新权值 or 斜率优化)
$ POJ~2018~Best~Cow~ Fences $(二分答案构造新权值) $ solution: $ 题目大意: 给定正整数数列 $ A $ ,求一个平均数最大的长度不小于 $ L $ 的子段 ...
- 动态规划优化_斜率优化
先来看一道题(HDU3507): 题意:给出N个单词,每个单词有个非负权值Ci,将k个单词排在一行的费用为(∑Ci)^2+M.求最优方案,使得总费用最小. 我们很容易得到一个O(N^2)的算法: s[ ...
- 逊哥dp专题 总结(普通dp,斜率优化dp,数位dp)
dp真是博大精深,本渣自叹智商不足,但是就算是不足也要拼死一搏,怒燃之 poj 3934 题意:给你n个身高都不同的人,然后排队,如果两人之间的所有人都比他们俩矮,那么他们俩可以互相看见,问你如果要正 ...
- BZOJ1597: [Usaco2008 Mar]土地购买(dp 斜率优化)
题意 题目链接 Sol 重新看了一遍斜率优化,感觉又有了一些新的认识. 首先把土地按照\((w, h)\)排序,用单调栈处理出每个位置第向左第一个比他大的位置,显然这中间的元素是没用的 设\(f[i] ...
- BZOJ 1597: [Usaco2008 Mar]土地购买( dp + 斜率优化 )
既然每块都要买, 那么一块土地被另一块包含就可以不考虑. 先按长排序, 去掉不考虑的土地, 剩下的土地长x递增, 宽y递减 dp(v) = min{ dp(p)+xv*yp+1 } 假设dp(v)由i ...
- 【BZOJ3963】[WF2011]MachineWorks cdq分治+斜率优化
[BZOJ3963][WF2011]MachineWorks Description 你是任意性复杂机器公司(Arbitrarily Complex Machines, ACM)的经理,公司使用更加先 ...
- BZOJ 1492: [NOI2007]货币兑换Cash [CDQ分治 斜率优化DP]
传送门 题意:不想写... 扔链接就跑 好吧我回来了 首先发现每次兑换一定是全部兑换,因为你兑换说明有利可图,是为了后面的某一天两种卷的汇率差别明显而兑换 那么一定拿全利啊,一定比多天的组合好 $f[ ...
- 『玩具装箱TOY 斜率优化DP』
玩具装箱TOY(HNOI2008) Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊 ...
最新文章
- oracle分页排序
- elasticsearch 运行原理
- 一个简单的记事本程序
- 数据结构课程设计 迷宫问题
- Python 16进制与字符串的转换、二进制 to 十进制、十六进制 to 十进制、十进制 to 二进制
- 阿里创业员工分享公司的BI选型之路!自研、开源的坑都踩过
- 在CentOS6和CentOS7安装epel仓库-最简单的方法
- python编程入门书籍-编程小白的第一本 Python 入门书
- Netflix Ribbon 负载均衡 概述 与 基本使用
- 两直线平行交叉相乘_初中数学几何公式、定理梳理,太全了!老师都转发了!...
- 传智播客C++学院教学总监朱景尧老师
- 前后端分离框架Vue+Element UI(上集)
- Mac上添加自己/公司的网络服务器盘
- 刀具半径补偿 c语言,C语言程序实现数控加工刀具半径补偿原理与坐标计算.pdf...
- 360度不停旋转动画demo效果示例(整理)
- SQL查询表结构相同的两张表中数据的差异
- 思考“手绘家谱”的算法
- git pull 出现 from the remote, but no such ref was fetched 已解决
- iscsi 远程连接磁盘
- 基于H5 小程序 UI框架选型 2020年9月10号