在一维中常见三种优化:
1.优化 固定位置~a[i], a是一个递增序列,用一个变量维护即可。
2.优化 c[i]~d[i], c和d都是递增序列,用单调队列可以优化。
3.优化 没有规律的一段,可能用线段树,树状数组优化。
在二维中也可能在某一维利用到上面三种优化。
斜率优化:
上面三种优化时,我们可以发现它们的转移方程没有与目标状态有非加减关系的。
对于两个状态可以用类似(y[j] - y[k])/(x[j] - x[k]) <= i 的式子比较出最优决策。
我们可以发现可以转化成一个平面上两点的斜率。
对于不同的题目可以分别检测上凸与下凸,从而得出维护上凸或下凸(就是一个凸要弹,一个凸不弹)。
dp的复杂度和状态数,转移负责度有关,因此优化动态规划要从这两个方面入手。
有一串字母(a-z)一次可以消去一串相同且相邻的串。求最少消去次数。
状态不太好想,f[i][j][0]代表i~j段目前还未选好要消去哪个字母。f[i][j][1-26]代表正在消去a-z已付代价。
f[i][j][0] = MIN(f[i][j][k] + 1);
1<=k<=26
f[i][j][?] = MIN(f[i][t - 1][?] + f[t + 1][j][0]))
t是i~j中字母?的位置(可以通过记录i~j中最后一个字母?的位置为w[i][j][?],t初始w[i][j][?],然后t = w[i][t - 1][?])
如果t不存在,f[i][j][?]=最后的f[i][j][0];