#include<iostream>
#include<vector>
#include<algorithm>
#include<iterator>
using namespace std;
pair<vector<vector<int>>,vector<vector<int>>> matrix_chain_order(vector<int> p)
{
int n = p.size();
vector<vector<int>> m(n, vector<int>(n, 0));//vector的vector相当于数组的数组,即二维数组m[][]
vector<vector<int>> s(n, vector<int>(n, 0));//同上s[][]
for (int len = 2; len < n; len++)
{
for (int i = 1; i < n - len + 1; ++i)
{
int j = i + len - 1;
m[i][j] = 0x7fffffff;
for (int k = i; k <= j-1; ++k)
{
int q = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j];
if (q < m[i][j])
{
m[i][j] = q;
s[i][j] = k;
}
}
}
}
return make_pair(m, s);
}
//打印最优解
void print_Optimal_Parens(vector<vector<int> > s, int i, int j)
{
if (i == j)
cout << "A" << i;
else
{
cout << "(";
print_Optimal_Parens(s, i, s[i][j]);
print_Optimal_Parens(s, s[i][j] + 1, j);
cout << ")";
}
}
//一般递归方法
int recursive_matrix_chain(vector<int> p, int i, int j)
{
int n = p.size();
vector<vector<int>> m(n, vector<int>(n, 0));
if (i == j)
return 0;
m[i][j] = 0x7fffffff;
for (int k = i; k < j; k++)
{
int q = recursive_matrix_chain(p, i, k) +
recursive_matrix_chain(p, k + 1, j) + p[i - 1] * p[k] * p[j];
if (q < m[i][j])
m[i][j] = q;
}
return m[i][j];
}
//带备忘的自顶向下的递归方法实现
int look_up_chain(vector<vector<int>> m, vector<int> p, int i, int j)
{
if (m[i][j] < 0x7fffffff)//如果m[i][j]不是无穷大则说明m[i][j]已经被下一层的LookUpChain计算出来
return m[i][j];
if (i == j)
m[i][j] = 0;
for (int k = i; k < j; k++)
{
int q = look_up_chain(m, p, i, k) +
look_up_chain(m, p, k + 1, j) + p[i - 1] * p[k] * p[j];
if (q < m[i][j])
m[i][j] = q;
}
return m[i][j];
}
int memoized_matrix_chain(vector<int> p,int s,int e)
{
int n = p.size();
vector<vector<int>> m(n, vector<int>(n, 0));
for (int i = 1; i < n; i++)
{
for (int j = i; j < n; ++j)
{
m[i][j] = 0x7fffffff;
}
}
return look_up_chain(m, p, s, e);
}
int main()
{
vector<int> p = { 30, 35, 15, 5, 10, 20, 25 };
vector<vector<int>> m = matrix_chain_order(p).first;
vector<vector<int>> s = matrix_chain_order(p).second;
cout << "vector m:" << endl;
for (size_t i = 0; i < m.size(); i++)
{
copy(m[i].begin(), m[i].end(), ostream_iterator<int>(cout, " "));
cout << endl;
}
cout << "vector s:" << endl;
for (size_t i = 0; i <s.size(); i++)
{
copy(s[i].begin(), s[i].end(), ostream_iterator<int>(cout, " "));
cout << endl;
}
cout << "输出最优解:————>";
print_Optimal_Parens(s, 1, 6);
cout << endl;
cout << "--------------------------------------------------" << endl;;
vector<vector<int>> m1 = matrix_chain_order(p).first;
vector<int> p1 = { 30, 35, 15, 5, 10, 20, 25 };
cout << "普通递归方法求解:";
cout << recursive_matrix_chain(p1, 1, 6) << endl;
cout << "带备忘的递归方法求解:";
cout << look_up_chain(m1, p1, 1, 6) << endl;
}