数据结构-矩阵连乘算法

数据结构,c语言
用先序序列和中序序列构建二叉树,采用二叉链表存储。编写递归算法,交换二叉树的左右子树,
输出新二叉树按先序遍历得到的结果。
提交格式:实现void solve(int n, int *preOrder, int *inOrder, int *outOrder)函数。
函数参数为序列长度n、先序序列preOrder、中序序列inOrder和输出序列outOrder。1<=n<=1000000,树的深度<=2000。
请不要printf输出任何内容。
输入样例1:
n=5,preOrder={1,2,3,4,5},inOrder={3,2,4,1,5}
输出样例1:
outOrder={1,5,2,4,3}

解答:

这道题可以使用动态规划来解决。
首先,我们可以使用一个二维数组 d p [ i ] [ j ] dp[i][j] dp[i][j] 表示在计算矩阵 A i ⋯ A j A_i \cdots A_j AiAj 连乘积的最小乘次数。这个数组的每一个元素都可以由更小范围内的矩阵连乘转移而来。具体地,我们可以枚举 k k k,使得 i ≤ k < j i \leq k < j ik<j,然后计算出 d p [ i ] [ j ] = min ⁡ ( d p [ i ] [ j ] , d p [ i ] [ k ] + d p [ k + 1 ] [ j ] + p [ i − 1 ] p [ k ] p [ j ] ) dp[i][j] = \min(dp[i][j], dp[i][k] + dp[k+1][j] + p[i-1]p[k]p[j]) dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+p[i1]p[k]p[j])
除了计算最小乘次数之外,我们还需要记录下来矩阵连乘的次序。我们可以使用一个二维数组 s [ i ] [ j ] s[i][j] s[i][j] 表示在计算矩阵 A i ⋯ A j A_i \cdots A_j AiAj 连乘积时, d p [ i ] [ j ] dp[i][j] dp[i][j] 这个值是由哪个矩阵转移而来的。这样,我们就可以通过 s s s 数组得到矩阵连乘的次序。
最后,我们可以通过递归的方式来输出矩阵连乘的次序。具体来说,我们可以写一个函数,输入为 i i i j j j,然后判断 i = j i=j i=j 的情况,输出 i i i。否则,我们输出 − 1 -1 1,然后调用递归函数来处理 i i i s [ i ] [ j ] s[i][j] s[i][j] 之间的矩阵,然后再输出 s [ i ] [ j ] + 1 s[i][j]+1 s[i][j]+1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值