#include<iostream>
#include<vector>
using namespace std;
void Optimal_BST(vector<double> q,vector<double> p,int n)
{
vector<vector<double>> e(n+2,vector<double>(n+1));
vector<vector<double>> w(n+2,vector<double>(n+1));
vector<vector<double>> root(n+1,vector<double>(n+1));
for(int i=1;i<=n+1;i++)
{
e[i][i-1]=q[i-1];
w[i][i-1]=q[i-1];
}
for(int l=1;l<=n;l++)
{
for(int i=1;i<=n-l+1;i++)
{
int j=i+l-1;
e[i][j]=INT_MAX;
w[i][j]=w[i][j-1]+p[j-1]+q[j];
for(int r=i;r<=j;r++)
{
double t=e[i][r-1]+e[r+1][j]+w[i][j];
if(t<e[i][j])
{
e[i][j]=t;
root[i][j]=r;
}
}
}
}
for(int i=1;i<=n+1;i++)
{
for(int j=i-1;j<=n;j++)
{
cout << "e[" << i << "," << j << "]=" << e[i][j] << "\t";
}
cout << endl;
}
cout << endl;
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j++)
{
cout << "root[" << i << "," << j << "]=" << root[i][j] << "\t";
}
cout << endl;
}
}
int main()
{
vector<double> p={0.04,0.06,0.08,0.02,0.10,0.12,0.14};
vector<double> q={0.06,0.06,0.06,0.06,0.05,0.05,0.05,0.05};
Optimal_BST(q,p,7);
return 0;
}
10-25