#include <iostream>
const int N=4;
namespace recursion
{ /*p数组存储比从start到end再多一个的数,
代表着m[start][end]*/
int matrixChain(const int *p,int start,int end)
{
if(start>=end)return 0;
int min=65536;
int temp=0;
for(int i=start;i<end;i++)
{
temp=matrixChain(p,start,i)+matrixChain(p,i+1,end)+p[start-1]*p[i]*p[end];
if(min>temp)min=temp;
}
return min;
}
};
namespace nonRecursion
{
/*p代表维数数组,n代表矩阵个数 s是记录分割处的数组,m是记录最小乘次数数组,数组第0行和第0列都不用*/
void matrixChain(int *p,int n,int s[][N+1],int m[][N+1])
{
int i,j,k;
for(i=1;i<=n;i++)m[i][i]=0;//先是一个一个矩阵,不用乘,所以次数都为零
for(int r=2;r<=n;r++)//以后就开始让i和j离开了,r代表他俩之间的矩阵个数包括他俩,开始是两个(就是他俩挨着),越来越远
for(i=1;i<=n-r+1;i++)
{
j=i+r-1;//j在i后面第r个 ,i 是i后面第一个
m[i][j]=m[i][i]+m[i+1][j]+p