关于动态规划的优化

在一维中常见三种优化:

  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];


原文地址:https://www.cnblogs.com/hsuppr/p/3166248.html