//还没想出来怎样输出加了括号后结果??????
#include<iostream>
#include<stdio.h>
using namespace std;
const int N=3;//N为矩阵个数
int p[N+1];//p[i]表示矩阵维数从0到N,
int m[N+1][N+1];//min[i][j]用递推法时记录A[i]*....a[j]的最优计算次数
int s[N+1][N+1];//记录分点位置
int matrixcchain_recursion(int* p,int start,int end)//初始时(p,1,N);
{
int temp;
int min=0xffff;
if(start>=end)
return min=0;
for(int k=start;k<end;k++)//枚举每两个矩阵之间的乘号
{
temp=matrixcchain_recursion(p,start,k)+matrixcchain_recursion(p,k+1,end)+p[start-1]*p[k]*p[end];
if(temp<min)
min=temp;
}
return min;
}
int matrixcchain_nonrecursion(int* p,int start,int end)//初始时(p,1,N);
{
for(int i=start;i<=end;i++)
m[i][i]=0;
//由于长区间的值依赖于短区间的值,故按照j-i递增的顺序递推;
for(int d=2;d<=end;d++)//d表示的是i,j之间的矩阵个数(包括i,j)
{
for(int i=start;i<=end-d+1;i++)
{
int j=i+d-1;
//初始化,即分点为i;(i)(i+1,。。,j)
m[i][j]=m[i][i]+m[i+1][j]+p[i-1]*p[i]*p[j];
s[i][j]=i;
//枚举中间的分点
int temp;
for(int k=i+1;k<j;k++)
{
temp=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];
if(temp<m[i][j])
{
m[i][j]=temp;
s[i][j]=k;
}
}
}
}
}
//输出加了括号的序列
void trace(int *s,int start,int end)
{
//还没想出来怎样输出加了括号后结果??????
}
int main()
{
for(int i=0;i<=N;i++)
scanf("%d",&p[i]);
//递归的解
printf("%d/n",matrixcchain_recursion(p,1,N));
//非递归求解
matrixcchain_nonrecursion(p,1,N);
printf("%d/n",m[1][N]);
return 0;
}