[每日一题] (石之游戏)
n堆石头排成一行,你每次可以把相邻的2堆石头聚成1堆,聚合后的石头数会成为你的分数的一部分。
问当进行n-1次,所有石头聚成一堆后,怎么使得总分最小。
例子: [3, 4, 3]
第一次 3+4=7 -> [7, 3]
第二次 (7) + 7 + 3 = 17 -> [17]
总分17最少。
Follow-up(Google onsite): 变成一个环
解题思路
使用动态规划,思路可参考算法导论的矩阵链乘法。
状态转移矩阵:
p[i][j] = min[p[i][k] + p[k+1][j] + s[i][j]] (i<=k<=j)
s[i][j] = s[i][k] + s[k+1][j]
其中p[i][j]表示从i合并到j所得的最小分数,s[i][j]表示从i合并到j所得出的数
Python:
|
|