// Original C++ solution (slower):


/** Which of the favors of your Lord will you deny ? **/



#include<bits/stdc++.h>

using namespace std;



#define LL long long

#define PII pair<int,int>

#define PLL pair<LL,LL>

#define MP make_pair

#define F first

#define S second



#define ALL(x) (x).begin(), (x).end()

#define DBG(x) cerr << __LINE__ << " says: " << #x << " = " << (x) << endl

#define READ        freopen("alu.txt", "r", stdin)

#define WRITE       freopen("vorta.txt", "w", stdout)



#include <ext/pb_ds/assoc_container.hpp>

#include <ext/pb_ds/tree_policy.hpp>

using namespace __gnu_pbds;



template<class TIn>using indexed_set = tree<TIn, null_type, less<TIn>,rb_tree_tag, tree_order_statistics_node_update>;



/**



PBDS

-------------------------------------------------

1) insert(value)

2) erase(value)

3) order_of_key(value) // 0 based indexing

4) *find_by_order(position) // 0 based indexing



**/



template<class T1, class T2>

ostream &operator <<(ostream &os, pair<T1,T2>&p);

template <class T>

ostream &operator <<(ostream &os, vector<T>&v);

template <class T>

ostream &operator <<(ostream &os, set<T>&v);



inline void optimizeIO()

{

    ios_base::sync_with_stdio(false);

    cin.tie(NULL);

}



const int nmax = 400+7;

const LL LINF = 1e17;



template <class T>

string to_str(T x)

{

    stringstream ss;

    ss<<x;

    return ss.str();

}



//bool cmp(const PII &A,const PII &B)

//{

//

//}



LL dp[nmax][nmax];



LL sum(int l,int r,const vector<LL> &v)

{

    LL s=0;

    for(int i=l;i<=r;i++)

        s += v[i];

    return s;

}



LL solve(int l ,int r,const vector<LL> &v)

{

    LL &ret = dp[l][r];



    if(ret!=-1) return ret;



    if(l==r) return ret = 0;



    ret = LLONG_MAX;

    LL cost = sum(l,r,v);

    for(int i=l;i<r;i++)

        ret = min(ret, solve(l,i,v) + solve(i+1,r,v) + cost);



    return ret;



}



int main()

{

    optimizeIO();



    int tc = 1;



    while(tc--)

    {

        int n;

        cin>>n;



        vector<LL>v(n);



        for(int i=0;i<n;i++)

            cin>>v[i];



        memset(dp,-1,sizeof dp);

        cout<<solve(0,n-1,v)<<endl;

    }



    return 0;

}



/**



**/



template<class T1, class T2>

ostream &operator <<(ostream &os, pair<T1,T2>&p)

{

    os<<"{"<<p.first<<", "<<p.second<<"} ";

    return os;

}

template <class T>

ostream &operator <<(ostream &os, vector<T>&v)

{

    os<<"[ ";

    for(int i=0; i<v.size(); i++)

    {

        os<<v[i]<<" " ;

    }

    os<<" ]";

    return os;

}



template <class T>

ostream &operator <<(ostream &os, set<T>&v)

{

    os<<"[ ";

    for(T i:v)

    {

        os<<i<<" ";

    }

    os<<" ]";

    return os;

}






// Optimized solution to the same problem (faster):


/** Which of the favors of your Lord will you deny ? **/



#include<bits/stdc++.h>

using namespace std;



#define LL long long

#define PII pair<int,int>

#define PLL pair<LL,LL>

#define MP make_pair

#define F first

#define S second



#define ALL(x) (x).begin(), (x).end()

#define DBG(x) cerr << __LINE__ << " says: " << #x << " = " << (x) << endl

#define READ        freopen("alu.txt", "r", stdin)

#define WRITE       freopen("vorta.txt", "w", stdout)



#include <ext/pb_ds/assoc_container.hpp>

#include <ext/pb_ds/tree_policy.hpp>

using namespace __gnu_pbds;



template<class TIn>using indexed_set = tree<TIn, null_type, less<TIn>,rb_tree_tag, tree_order_statistics_node_update>;



/**



PBDS

-------------------------------------------------

1) insert(value)

2) erase(value)

3) order_of_key(value) // 0 based indexing

4) *find_by_order(position) // 0 based indexing



**/



template<class T1, class T2>

ostream &operator <<(ostream &os, pair<T1,T2>&p);

template <class T>

ostream &operator <<(ostream &os, vector<T>&v);

template <class T>

ostream &operator <<(ostream &os, set<T>&v);



inline void optimizeIO()

{

    ios_base::sync_with_stdio(false);

    cin.tie(NULL);

}



const int nmax = 400+7;

const LL LINF = 1e17;



template <class T>

string to_str(T x)

{

    stringstream ss;

    ss<<x;

    return ss.str();

}



//bool cmp(const PII &A,const PII &B)

//{

//

//}



LL dp[nmax][nmax];



LL sum(int l,int r,const vector<LL> &v)

{

    LL s=0;

    for(int i=l;i<=r;i++)

        s += v[i];

    return s;

}



int main()

{

    optimizeIO();



    int tc = 1;



    while(tc--)

    {

        int n;

        cin>>n;



        vector<LL>v(n);



        for(int i=0;i<n;i++)

            cin>>v[i];



        for(int l=n-1;l>=0;l--)

        {

            for(int r=0;r<n;r++)

            {

                if(l==r) dp[l][r] = 0;

                else

                {

                    dp[l][r] = LLONG_MAX;

                    LL cost = sum(l,r,v);



                    for(int i=l;i<r;i++)

                        dp[l][r] = min(dp[l][r],dp[l][i] + dp[i+1][r] + cost);

                }

            }

        }



        cout<<dp[0][n-1]<<endl;

    }



    return 0;

}



/**



**/



template<class T1, class T2>

ostream &operator <<(ostream &os, pair<T1,T2>&p)

{

    os<<"{"<<p.first<<", "<<p.second<<"} ";

    return os;

}

template <class T>

ostream &operator <<(ostream &os, vector<T>&v)

{

    os<<"[ ";

    for(int i=0; i<v.size(); i++)

    {

        os<<v[i]<<" " ;

    }

    os<<" ]";

    return os;

}



template <class T>

ostream &operator <<(ostream &os, set<T>&v)

{

    os<<"[ ";

    for(T i:v)

    {

        os<<i<<" ";

    }

    os<<" ]";

    return os;

}






// Fastest known solution for this problem: