(石子合并)有 n 堆石子排成一排,第 i 堆有 a[i] 个石子。每次可以合并相邻的两堆,合并的代价为这两堆石子数之和。求把所有石子合并成一堆的最小总代价。保证 1 ≤ n ≤ 300,0 ≤ a[i] ≤ 10000。
以下代码用区间 DP 求解,f[l][r] 表示把第 l 堆到第 r 堆合并成一堆的最小代价。试补全程序。
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 305;
int a[MAXN], sum[MAXN];
int f[MAXN][MAXN];
int main() {
int n;
scanf("%d", &n);
for (int i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
sum[i] = sum[i - 1] + a[i];
}
___①___;
for (int i = 1; i <= n; ++i) f[i][i] = ___②___;
___③___
for (int l = 1; l + len - 1 <= n; ++l) {
int r = l + len - 1;
for (int k = l; k < r; ++k)
f[l][r] = ___④___;
}
printf("%d\n", ___⑤___);
return 0;
}