2013-team6/dp

从 Trac 迁移的文章

这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。

原文章内容如下:

http://www.notonlysuccess.com/index.php/dp_optimize/

=== 四边形不等式 ===

dp[i][j] = min { dp[i][k] + dp[k+1][j] } + w(i,j)

1: 判断 是否满足 w(i,j) + w(i+1,j+1) <= w(i,j+1) + w(i+1,j) (凸函数)

2: 判断 是否满足 w(i+1,j) <= w(i,j+1)                      (区间单调关系)

3: 若满足1与2, 则 s[i][j-1] <= s[i][j] <= s[i+1][j] , s[i][j] 为 dp[i][j]的最优决策

复杂度 O(n^2 )

----

=== 斜率优化 ===

dp[i] = min { dp[j] } + a[i] * b[j] + F(i)

转化为 G = y[i] + a[i] * x[i]  ( y[i] = dp[j] , x[i] = b[j] )

维护一个下凸的序列

1) a[i], x[i] 均单调 , 单调队列维护 ,对于每一个步:

    1: 判断 G(q[qh]) > G(q[qh+1]) , 队头出队

    2: dp[i] = G(q[qh]]) + F(i)

    3: 将 i 加入队尾, 判断队列中最后3个点是否下凸 , 注意a[i] , x[i] 的单调性 

    复杂度O(n^2 )

2)a[i], x[i] 至少一个不单调   平衡术维护 

http://www.notonlysuccess.com/index.php/dp_optimize/

四边形不等式

dp[i][j] = min { dp[i][k] + dp[k+1][j] } + w(i,j)

1: 判断 是否满足 w(i,j) + w(i+1,j+1) <= w(i,j+1) + w(i+1,j) (凸函数)

2: 判断 是否满足 w(i+1,j) <= w(i,j+1) (区间单调关系)

3: 若满足1与2, 则 s[i][j-1] <= s[i][j] <= s[i+1][j] , s[i][j] 为 dp[i][j]的最优决策

复杂度 O(n^2 )


斜率优化

dp[i] = min { dp[j] } + a[i] * b[j] + F(i)

转化为 G = y[i] + a[i] * x[i] ( y[i] = dp[j] , x[i] = b[j] )

维护一个下凸的序列

1) a[i], x[i] 均单调 , 单调队列维护 ,对于每一个步:

1: 判断 G(q[qh]) > G(q[qh+1]) , 队头出队

2: dp[i] = G(q[qh]]) + F(i)

3: 将 i 加入队尾, 判断队列中最后3个点是否下凸 , 注意a[i] , x[i] 的单调性

复杂度O(n^2 )

2)a[i], x[i] 至少一个不单调 平衡术维护