问题描述:
给定n个矩阵的链,矩阵的规模为
,求完全括号化方案使得求解
所用标量乘法代价最少。
分析:
最近发现对函数迭代不熟练 所以找了一些相关题目练习。主要思路参考
https://blog.csdn.net/Dylan_Frank/article/details/52060278
https://blog.csdn.net/u013713010/article/details/48213349
#include <iostream>
#include <algorithm>
using namespace std;
#define INF 0x7fffffff
#define MAXN 100
int map[MAXN][MAXN];
int bracket[MAXN][MAXN];
int SortMinMul(int *p, int len, int n, int m)
{
int i;
int mul_min = INF;
if (n == m) return 0;
int delta = 0;
int mul_num = 0;
for (i = n; i < m; i++)
{
delta = p[n - 1] * p[i] * p[m];
mul_num = SortMinMul(p, len, n, i) + SortMinMul(p, len, i + 1, m) + delta;
if (mul_num < mul_min)
bracket[n][m] = i; //存储最优分割
mul_min = min(mul_min, mul_num);
}
map[n][m] = mul_min; //存储最小乘法数
return mul_min;
}
int PrintBracket(int n, int m) //打印最优分割方法
{
if (n == m)
{
printf("A%d", n);
return 0;
}
int i = bracket[n][m];
printf("(");
PrintBracket(n, i);
PrintBracket(i+1, m);
printf(")");
return 0;
}
int main()
{
int p[15] = { 0 }; //p(i)
for (int i = 0; i < 15; i++)
{
p[i] = rand();
}
int len = sizeof(p) / sizeof(p[0]) - 1;
int mul_count = SortMinMul(p, len, 1, len);
PrintBracket(1, len);
return 0;
}