矩阵连乘

这个地方要注意动态数组的初始化:

下面是代码,有两种动态数组的初始化方式

#include<iostream>
#include<cstdlib>
using namespace std;
void MatrixChain(int *p,int n,int * *m,int * *s)
{
	for(int i = 1;i <= n;i++)
	m[i][i] = 0;
	for(int r = 2;r <= n;r++)
	for(int i = 1;i <= n - r + 1;i++)
	{
		int j = i + r - 1;
		m[i][j] = m[i + 1][j] +p[i - 1] * p[i] *p[j];
		s[i][j] = i;
		for(int k = i + 1;k < j;k++)
		{
			int t = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] *p[j];
			if(t < m[i][j])
			{
				m[i][j] = t;
				s[i][j] = k;
			}
		}
	}
	cout <<"最少数乘次数为:" << m[1][n] << endl;
}
void Traceback(int i,int j,int **s)
{
	if(i == j)
	return ;
	Traceback(i,s[i][j],s);
	Traceback(s[i][j] + 1,j,s);
	cout << "Multiply A" << i << "," << s[i][j];
	cout << "and A" << (s[i][j] + 1) << "," << j << endl;
}
int main()
{
	int n;
	cin >> n;
	int list[n + 1];
    /*int** m = new int*[n+1];//动态数组的初始化方式1
    m[0] = new int[(n+1)*(n+1)];
    int** s = new int*[n+1];
    s[0] = new int[(n+1)*(n+1)];
    for(int i = 1; i < n+1; i ++)
    {
        m[i] = m[i-1] + n+1;
        s[i] = s[i-1] + n+1;
    }*/
    int **s = new int *[n + 1];//动态数组的初始化方式二
    int **m = new int *[n + 1];
    for(int i=0;i< n + 1;i++)
    {
        s[i] = new int[n + 1];
        m[i] = new int[n + 1];
    }
	for(int i = 0;i < n + 1;i++)
	cin >> list[i];
	if(n == 1)
	cout << "计算次数为:0" << endl;
	else
	MatrixChain(list,n,m,s);
	Traceback(1,n,s);
	return 0;
}
/*
6
30 35 15 5 10 20 25
*/

原文地址:https://www.cnblogs.com/lu1nacy/p/10016666.html