大意略。
思路:参见《算法导论》P215.
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
const int MAXN = 260;
const int INF = 0x3f3f3f3f;
int n;
int d[MAXN][MAXN];
bool vis[MAXN][MAXN];
int sum[MAXN];
int p[MAXN];
void init()
{
memset(sum, 0, sizeof(sum));
memset(vis, 0, sizeof(vis));
}
/*int sum(int i, int j)
{
int s = 0;
for(int k = i; k <= j; k++) s += p[k];
return s;
}*/
int dp(int i, int j)
{
int &ans = d[i][j];
if(vis[i][j]) return ans;
vis[i][j] = 1;
ans = INF;
if(i >= j) ans = 0;
else
{
for(int r = i; r <= j; r++)
{
int w = sum[j] - sum[i-1] - p[r];
ans = min(ans, dp(i, r-1) + dp(r+1, j) + w);
}
}
return ans;
}
void read_case()
{
init();
for(int i = 1; i <= n; i++)
{
scanf("%d", &p[i]);
sum[i] = sum[i-1] + p[i];
}
}
void solve()
{
read_case();
int ans = dp(1, n);
printf("%d\n", ans);
}
int main()
{
while(~scanf("%d", &n))
{
solve();
}
return 0;
}