蓝桥杯-算法提高-合并石子-DP
- 问题描述
在一条直线上有n堆石子,每堆有一定的数量,每次可以将两堆相邻的石子合并,合并后放在两堆的中间位置,合并的费用为两堆石子的总数。求把所有石子合并成一堆的最小花费。 - 输入格式
输入第一行包含一个整数n,表示石子的堆数。
接下来一行,包含n个整数,按顺序给出每堆石子的大小 。 - 输出格式
输出一个整数,表示合并的最小花费。 - 样例输入
5
1 2 3 4 5 - 样例输出
33 - 数据规模和约定
1<=n<=1000, 每堆石子至少1颗,最多10000颗。 - 解题思路:
参考算法提高——合并石子!!!
dp[i][j]:第i堆石子到第j堆石子合并的时间;
逆向考虑,把一堆石头分为两堆,设置一个中间点k ,d[ i ][ j ] = d[ i ][ k ] + d[k + 1][ j ]),遍历每一个处于[ i , j ]中的每一个中间点k;
合并的时候,第i堆到第j堆之间的间距len,len的取值范围为[1,n];
所以i和j的关系为:
int j=i+len-1;
状态转移方程:
dp[i][j]=min(dp[i][k]+dp