石子合并

在一片沙滩上摆放着 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  <
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值