单调队列&单调栈:
有手就行.jpg
四边形不等式:
若(w(i,j))满足(forall ale b<cle d,w(a,c)+w(b,d)le w(b,c)+w(a,d)),那么我们称(w(i,j))满足四边形不等式。
若(w(i,j))满足(forall ale b<cle d,w(b,c)le w(a,d)),那么我们称(w(i,j))满足区间包含单调性。
对于这样一般形式的转移方程:(f_{l,r}=minlimits_{lle k}(f_{l,k}+f_{k+1,r})+w(l,r)),若(w(i,j))既满足区间包含单调性又满足四边形不等式,那么(f)也满足四边形不等式。设(s_{i,j})表示(f_{i,j})取到最优决策的(k),那么(s_{i,j})单调,即(s_{i,j-1}le s_{i,j}le s_{i+1,j})。
换根dp:
大概就是先把原本的跑一遍,同时再跑一遍原来的去掉某个子树后的答案。
然后每个点再处理一下。
斜率优化
比如(f_i=maxlimits_{jin[1,i)}(f_j-a_ia_j+a_i+a_j))。
我们把后面的式子中只含(i)的提出来,只含(j)的放在一起,同时含(i,j)的放在一起。
(f_i=a_i+maxlimits_{jin[1,i)}((f_j+a_j)-a_ia_j))
后面的东西我们可以看做是经过((a_j,a_j+f_j))的斜率为(a_i)的直线的截距。
那么我们要求截距的最大值,这东西就是一个凸包。
根据斜率与横坐标单调性的有无可以用诸如单调栈、二分栈、set(平衡树)维护凸包。