矩阵连乘求最小连乘次数(动态规划)

方法一:递归 , 时间复杂度为(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;
}

 

 

 

 

 

 

你可能感兴趣的:(算法)