区间dp
#include<bits/stdc++.h>
using namespace std;
int main(int argc, char const *argv[])
{
int n;
cin >> n;
int a[305], sum[305];
for (int i = 1; i <= n; ++i)
{
cin >> a[i];
sum[i] += sum[i-1] + a[i];
}
int dp[305][305];
memset(dp, 0x3f3f3f3f, sizeof(dp));
for (int j = 1; j <= n; ++j)
{
for (int i = j; i >= 1; --i)
{
if (i == j)
{
dp[i][j] = 0;
continue;
}
for (int k = i; k < j; ++k)
{
dp[i][j] = min(dp[i][j], dp[i][k] + dp[k+1][j] + sum[j] - sum[i-1]);
}
}
}
cout << dp[1][n];
return 0;
}