方法一:递归 , 时间复杂度为(2^n);
1. 设有矩阵A1 , A2 , A3 , A4 , 维度分别为(2 * 3 , 3 * 4, 4 * 5, 5 * 6)
2. 设a数组 = {2,3,4,5,6} ; n 为数组长度 5;
3. 因为不知道从哪里断开才能达到成乘积之和最小 ,所以只能一个一个尝试
设 k 为最佳断开点 , 设置两个标志 start = 0 , end = n; 则k的取值为 start < k < end;
所求问题最小值为 f(start , k) + f(k + 1, end) + a[start - 1] * a [k] * a[end] ;
则可推出递归代码:
int f(int *a, int start ,int end)
{
int [][] s = new int[a.length][a.length]; // 记录start 到 end 的最佳断点,也就是k值
if(start == end)
return 0;
int min = f(start,start) + f(start,end + 1) + a[start - 1] * a[start] * a[end];
//作用类似于初始化 , 不用太过纠结这一步
//如果start == 0 或者end = a.length 只需设置a[start - 1] 和 a[end] 返回1即可
for(int k = start + 1; k < end; k++)
{
int m = f(start,k) + f(k+1,end) + a[start-1] * a[k] * a[end];
if(m < min)
{
min = m;
s[start][end] = k;
}
}
return min;
}