Pagini recente » Cod sursa (job #76877) | Cod sursa (job #1414373) | Cod sursa (job #2935378) | Cod sursa (job #3190578) | Cod sursa (job #799581)
Cod sursa(job #799581)
#include <fstream>
#include <iostream>
using namespace std;
ifstream in("podm.in");
ofstream out("podm.out");
const int nmax = 550;
struct par
{
int l; int r;
};
par t[nmax], f[nmax], f2[nmax];
int v[nmax], mk=0, mf=0, b[nmax][nmax],n;
void init()
{
mk=0; mf=0;
for(int i=0; i<=n; i++)
{
for(int j=0; j<=n; j++) b[i][j]=0;
f2[i].r = f2[i].l = 0;
}
}
int m(int i, int j, int c)
{
if(i>=j-1) return 0;
if(b[i][j]) return b[i][j];
int d, p, kmin=0; if(c) d = 0; else d = 0x4FFFFFF0;
for(int k = i+1; k<j; k++)
{
p = m(i,k,c) + m(k, j,c) + v[i]*v[k]*v[j];
if(p<d&&!c || p>d&&c) d=p, kmin=k;
}
// cout << "i: " << i << " k: " << kmin << " j: " << j << " p: " << min << endl;
b[i][j] = d;
if(kmin-i>1) {t[mk].l=i; t[mk].r=kmin; mk++;}
if(j-kmin>1) {t[mk].l=kmin; t[mk].r=j; mk++;}
return d;
}
int ok(int a, int b, int c, int d)
{
if(a<c && c<b && b<d) return 0;
if(c<a && a<d && d<b) return 0;
return 1;
}
void parant(par x)
{
int i;
for(i=0; i<mf; i++)
{
if(x.r==f[i].r && x.l==f[i].l) return;
if(!ok(f[i].l, f[i].r, x.l, x.r)) return;
}
f[mf++]=x;
f2[x.l].l++;
f2[x.r].r++;
}
void print()
{
int i,j;
for(i=1; i<n; i++)
{
for(j=0; j<f2[i].l; j++) out << "[ ";
out << '(' << v[i] << ',' << v[i+1] << ')'; out << " ";
for(j=0; j<f2[i+1].r; j++) out << "] ";
}
out << endl;
}
int main()
{
int i;
in >> n; n++;
for( i=1; i<=n; i++) in >> v[i];
out << m(1,n, 0) << endl;
/*for(i=mk-1; i>=0; i--) parant(t[i]);
print();
init();
for( i=1; i<=n; i++) in >> v[i];
out << m(1,n, 1) << endl;
for(i=mk-1; i>=0; i--) parant(t[i]);
print();*/
return 0;
}