最简单的区间型动态规划。
为了方便起见,做了一个显而易见的操作,S数组,S[N]记录从1到N的和。
则从I到J的和为S[J]-S[I-1]
#include<iostream>
#include<cstdio>
#include<stdlib.h>
#include<memory.h>
using namespace std;
const int MAX_N = 101;
int f[MAX_N][MAX_N];
int R[MAX_N];
int S[MAX_N];
int N;
int ans;
int init()
{
scanf("%d",&N);
int i;
for (i=1;i<=N;i++)
scanf("%d",&R[i]),S[i]=S[i-1]+R[i];
}
int work()
{
int i,j,k;
memset(f,1,sizeof(f));
for (i=1;i<=N;i++)
f[i][i]=0;
for (j=1;j<=N;j++)
for (i=j-1;i>=1;i--)
for (k=i;k<j;k++)
f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+S[j]-S[i-1]);
}
int put()
{
printf("%d",f[1][N]);
}
int main()
{
init();
work();
put();
return 0;
}