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

本文探讨了矩阵链乘法的优化问题,通过递归方法寻找最佳断开点以实现乘积之和最小化,介绍了时间复杂度为(2^n)的解决策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值