题目链接:282. 石子合并 - AcWing题库
#include <iostream>
using namespace std;
const int maxn = 10000;
const int INF = 0x3f3f3f3f;
int s[maxn],f[maxn][maxn];
// dp[i][j] i~j merge cost min dp[i][j] = min(dp[i][k]~dp[i][j])
// k>=i&&k<j
int main()
{
int a,n;
scanf("%d",&n);
for(int i = 1;i <= n;i++) scanf("%d",&a),s[i]=s[i-1]+a;
for(int r = 2;r <= n;r++)
{
for(int i = 1;i+r-1 <= n;i++)
{
int j = i+r-1;
f[i][j] = INF;
for(int k = i; k < j;k++)
f[i][j] = min(f[i][j],f[i][k]+f[k+1][j]+s[j]-s[i-1]);
}
}
printf("%d\n",f[1][n]);
return 0;
}