线性石子合并


Submit solution

Points: 100
Time limit: 2.0s
Memory limit: 80M

Author:
Problem type
Allowed languages
C, C++

题目名称:线性石子合并

题目描述:

给定一个长度为 \(n \) 的石子序列,初始时有 \( n \) 堆石子,每一堆有 \( a_i \) 个石子。

每次你可以将相邻的两堆石子合并为一堆,合并的代价为这两堆石子的总数。合并之后,这堆石子仍然可以参与后续合并。

你的任务是通过若干次合并,将所有的石子最终合并成一堆,并求出最小的总合并代价


输入格式:
  • 第一行一个整数 \(n \) \(( 1 \leq n \leq 500 )\)
  • 第二行为 \( n \) 个整数 \(a_1, a_2, \ldots, a_n \) 每个 \(( 1 \leq a_i \leq 100 )\)

输出格式:
  • 一行一个整数,表示最小的总合并代价。

样例输入:

4
4 5 9 4
样例输出:

44

样例解释:

一种最优的合并方式如下(只展示合并顺序和每次代价):

  • 合并第1堆和第2堆:\(( 4+5=9 )\),新序列:\([9, 9, 4]\)
  • 合并第1堆和第2堆:\(( 9+9=18 )\),新序列:\([18, 4]\)
  • 合并第1堆和第2堆:\(( 18+4=22 )\),最终合并完毕。

总代价:\(( 9+18+22=49 )\)(本例非最优,仅举例)。


Comments

There are no comments at the moment.