Minimum Merge Cost Extension - 最小合并代价扩展
问题
在

解法
本问题与
设 sum(i,j) 为序列中区域 s[i,j] 的所有元素之和,设 f(i,j) 为合并区域 s[i,j] 产生的最小代价,其中 i,j \in [1,2n] 且 i \leq j 。因此有如下状态转移方程:
f(i,j) =
\begin{cases}
0 & (初始化)i,j \in [0,2n],i = j \
+\infty & (初始化)i,j \in [0,2n],i \neq j \
min {f(i,k)+f(k+1,j)+sum(i,k)+sum(k+1,j) } & i,j \in [0,2n],i \leq k \leq j
\end{cases}
(1) s[i,i] 不需要合并,因此 f(i,i) = 0 ;
(2) s[i,j] 需要合并,我们的最终目标是获取合并最小代价,因此设未知的 f(i,j) = +\infty ;
(3) 假设将 s[i,k] 和 s[k+1,j] 这两个区域的元素合并。合并 s[i,k] 和 s[k+1,j] 的过程中,已知 s[i,k] 范围的总和为 sum(i,k) ,消耗的代价为 f(i,k) , s[k+1,j] 范围的总和为 sum(k+1,j) ,消耗的代价为 f(k+1,j) 。因为 k \in [i,j] ,因此 f(i,j) = min { f(i,k)+f(k+1,j)+sum(i,k)+sum(k+1,j) } ,选择该范围中所有结果的最小值即可;
f(0,2n) 即为序列 s 的最小合并代价。该算法的时间复杂度是 O(n^2) 。
源码
import, lang:”c_cpp”
测试
import, lang:”c_cpp”
