#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define SIZE 100
#define INF 999999999
int memo[SIZE][SIZE];
//m数组内存放矩阵链的行列信息
//m[i-1]和m[i]分别为第i个矩阵的行和列(i = 1、2、3...)
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);
printf("Multiply A %d,%d\n",i,s[i][j]);
printf("and A %d,%d\n",(s[i][j]+1),j);
}
int Best_Memo(int m[], int left, int right)
{
//只有一个矩阵时,返回计算次数0
if (left == right)
{
return 0;
}
int min = INF;
int i;
//括号依次加在第1、2、3...n-1个矩阵后面
for (i = left; i < right; i++)
{
//计算出这种完全加括号方式的计算次数
int count;
if (memo[left][i] == 0)
{
memo[left][i] = Best_Memo(m, left, i);
}
count = memo[left][i];
if (memo[i+1][right] == 0)
{
memo[i+1][right] = Best_Memo(m, i+1, right);
}
count += memo[i+1][right];
count += m[left-1] * m[i] * m[right];
//选出最小的
if (count < min)
{
min = count;
}
}
return min;
}
int main(void)
{
int m[SIZE];
int n;
while (scanf("%d", &n) != EOF)
{
int i;
for (i = 0; i < n; i++)
{
scanf("%d", &m[i]);
}
memset(memo, 0, sizeof(memo));
printf("%d\n", Best_Memo(m, 1, n-1));
printf("矩阵最优计算次序为:\n");
Traceback(1,n,memo);
}
return 0;
}
解决方案
20
void Traceback(int i,int j,int **s)
改成:
void Traceback(int i,int j,int s[100][100])
改成:
void Traceback(int i,int j,int s[100][100])
5
多看基础,**s是一个二级指针,你声明的是动态的二维数组。
10
10
请那些喜欢将数组作为函数参数传来传去或作为函数返回值的码农思考一下为什么不把整个互联网内容当作函数参数传来传去或作为函数返回值呢?