直线的斜率

斜率优化DP

送分小仙女□ 提交于 2019-11-27 00:34:00
我们经常写DP时,我们的代码会超时 而再化简状态转移方程或则另想方法通常不容易 于是 我们 大佬们变想出了各种优化 这次的斜率优化便是其中一种 什么是斜率优化 表示一条直线(或曲线的切线)关于(横)坐标轴倾斜程度的量。它通常用直线(或曲线的切线)与(横)坐标轴夹角的正切,或两点的纵坐标之差与横坐标之差的比来表示。 又称“角系数”,是一条直线对于横坐标轴正向夹角的正切,反映直线对水平面的倾斜度。.一条直线与某平面直角坐标系横坐标轴正半轴方向所成的角的正切值即该直线相对于该坐标系的斜率.如果直线与x轴互相垂直,直角的正切值无穷大,故此直线不存在斜率。当直线L的斜率存在时,对于一次函数y=kx+b,(斜截式)k即该函数图像的斜率。—— 萌娘 百度百科 总之我们只需要知道 斜率 \(k=\frac{x_i-x_j}{y_i-y_j}\) 判断 对于DP中最后一层循环 取j还是取k更优(不妨设j<k) 如果 当 \(f(j) + s*g(j)<f(k)+s*g(k)\) 时j更优 否则 \(k\) 更优 可以变形为 \(\frac{f(j)-f(k)}{g(k)-g(j)}<s\) (如果g(k)>g(j))这里我们假设如此 实际题目中需证明 反一下 \(\frac{f(k)-f(j)}{g(k)-g(j)}>s\) 得到类似的式子就可以采用斜率优化啦 前置知识 单调队列,DP 具体方式

斜率优化DP学习笔记

瘦欲@ 提交于 2019-11-27 00:25:06
一、简述斜率优化 初步了解 本文以 luoguP3195 玩具装箱 为例,我们很容易可以的出下面这个柿子: \[ f_i = \min_{j = 1}^{i - 1} \{ f_j + (i - j - 1 + s_i - s_j - L) ^ 2 \} \] 设 \(b_i = s_i + i\) , \(j\) 为 \(f_i\) 的最优决策点,则有: \[ f_i = f_j + (b_i - b_j - (L + 1)) ^ 2 \] 把只与 \(j\) 有关的放在左边: \[ f_j + b_j + 2 b_j (L + 1) = 2 b_i b_j - b_i ^ 2 - (L + 1) ^ 2 + 2 b_i (L + 1) + f_i \] 把 \(b_j\) 看做横坐标, \(f_j + b_j + 2 b_j (L + 1)\) 看做纵坐标,这个式子就是一条经过点 \(\big( b_j, f_j + b_j + 2 b_j (L + 1) \big)\) ,斜率为 \(2 b_i\) 的直线, \(-b_i^2 - (L + 1) ^ 2 + 2 b_i (L + 1) + f_i\) 就看做截距。 由于 \(b_i\) 是确定的,截距中除 \(f_i\) 以外的所有单项式都是常量,所以 \(j\) 是使该直线截距最小的点,可以看成一条斜率为 \(2 b_i\

关于动态规划的斜率优化

帅比萌擦擦* 提交于 2019-11-26 20:28:55
其实关于数形结合的这种思想我一直不太明白 最近学了一下关于斜率优化方面的知识,才慢慢地理解了这种思想方法 使用条件 关于动态规划 如果方程形如: $ F[i]=min(a[i] f[j]+b[i] c[j]+d[i]) $ 就是在方程中有关于i的常数和关于j的常数的乘积。这时候使用斜率优化最恰当。 主要思想 数形结合!! 我们观察式子: 我们要使得决策点j优于决策点k 那就是 $ a[i] f[j]+b[i] c[j]+d[i]<a[i] f[k]+b[i] c[j]+d[i] $ $ a[i] f[j]+b[i] c[j]<a[i] f[k]+b[i] c[k] $ $ a[i] f[j]-a[i] f[k]<b[i] c[k]-b[i] c[j] $ $ a[i] (f[j]-f[k])<b[i] (c[k]-c[j]) $ $ \frac{f[j]-f[k]}{c[k]-c[j]}<\frac{b[i]}{a[i]} $ 我们把关于j,k的放在不等式左边,然后把常数(已知的)都放右边 这样左边的式子就是一个斜率一样的东西 即,j点的坐标为($ f[j] $,$ -c[j] $) 然后我们可以把整个式子化成一个一次函数的形式: $ f[i]=a[i] f[j]+b[i] c[j]+d[i] $ 其中我们知道了j的坐标,所以: $ a[i] f[j]=b[i] (-c[j])+f