(SPOJ) 345. Mixtures

0
/*
user: hasib
time: 0.07 sec
link: http://www.spoj.com/problems/MIXTURES/
*/


#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>

#include<string>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#include<sstream>


#define loop(i, n) for(int i=0; i<n; i++)
#define FOR(i, s, e) for(int i=s; i<e; i++)
#define mem(a, v) memset(a, v, sizeof(a))
#define pb push_back
#define sf scanf
#define pf printf
#define getint(a) sf("%d", &a)
#define INF 1<<29
#define SZ(v) int(v.size())
#define pi acos(-1.0)
#define all(v) v.begin(), v.end()
#define read() freopen("input.txt", "r", stdin)
#define write() freopen("output.txt", "w", stdout)

using namespace std;


#define MAXX 101
#define type int




int number_of_color;
int colors[MAXX];

type dp[MAXX][MAXX];
int new_color[MAXX][MAXX];

type rec(int s, int e)
{


    type &ret = dp[s][e];
    if(ret != -1) return ret;


    if(s + 1 == e )
    {
        new_color[s][e] = (colors[s] + colors[e]) % 100;
        return ret = (colors[s] * colors[e]);
    }
    else if(s==e)
    {
        new_color[s][e] = colors[s];
        return ret = 0;
    }


    ret = INF;


    for(int i=s; i<e; i++)
    {
        rec(s, i);
        rec(i+1, e);
        if( rec(s, i) + rec(i+1, e) + (new_color[s][i] * new_color[i+1][e]) < ret )
        {
            new_color[s][e] = (new_color[s][i] + new_color[i+1][e]) % 100;
            ret = rec(s, i) + rec(i+1, e) + (new_color[s][i] * new_color[i+1][e]);
        }
    }

    return ret;
}






int main()
{
    while(getint(number_of_color) == 1)
    {
        loop(i, number_of_color)
        {
            getint(colors[i]);
        }
        mem(dp, -1);
        cout<<rec(0, number_of_color - 1)<<endl;
    }

    return 0;



}