石子合并问题
有n堆石子排成一排,每堆石子有一定的数量,将n堆石子合并成一堆。合并的规则是每次只能合并相邻的两堆石子,合并的花费为这两堆石子的总数。石子经过n-1次合并后成为一堆,求总的最小花费。
输入:第一行为堆数,第二行为石子数
输出:总的最小花费
样例如下:
Input
3
2 4 5
output
17
这显然是一道动态规划的题目,那么我们应该运用动规以大化小的思想,找到问题,在这里我们需要的就是将石堆合并,并且计算最小花费,花费是两堆石子的总数,我们可以通过每几堆石堆的最小解,直到达到输入的石子堆数,将每种堆数的最小花费计算出来,公式如下:
dp[i][j] = min(dp[i][j], dp[i][k] + dp[k+1][j] + sum[j] - sum[i-1]);
于是,我们可以从两堆,然后求三堆,四堆,直至n堆,从每种情况中找出单独的最优解,就可以向结果推进,直至结果出现
运用这种思想,我们可以得到如下代码
#include <stdio.h>
#include <stdlib.h>