在一片沙滩上摆放着 n堆石子。 现要将石子有次序地合并成一堆。 规定每次选2 堆相邻石子合并成新的一堆,合并的费用为新的一堆石子数。试设计一个算法,计算出将 n堆石子合并成一堆的最小总费用。
第一眼以及很多眼都觉得是贪心,但是结果确实有问题,看了很多,有点收获。
( 1 )写出动态转移方程
设 Min [i][j] 代表从第 i 堆石子到第 j 堆石子合并的最小花费。
Min [ i ][ j ] = 0 (i = j)
Min [ i ][ j ] = min ( Min [ i ][ k ] + Min [ k + 1][ j ] + sum( i , j )) , i < j( i ≤ k < j)
Max [i][j] 代表从第 i 堆石子到第 j 堆石子合并的最大花费。
Max [ i ][ j ] = 0 (i = j)
Max [ i ][ j ] =max( Max [ i ][ k ] + Max [ k + 1][ j ] + sum ( i , j )) , i < j ( i ≤ k < j)
( 2 )循环计算min数组的值
例如 5 8 6 9 2 3
1 | 2 | 3 | 4 | 5 | 6 | |
sum | 5 | 13 | 19 | 28 | 30 | 33 |
sum(i,j) = sum[ j ] - sum[ i - 1 ];//需加上sum[ 0 ] = 0;否则会溢出
min | 1 | 2 | 3 | 4 | 5 | 6 |
1 | 0 | 13 | ||||
2 | 0 | 14 | ||||
3 | < |