Week5,6(09.23-10.08) 算法分析与设计 作业(矩阵连乘问题与最长公共子序列)

Week5,6(09.23-10.08) 算法分析与设计 作业(矩阵连乘问题与最长公共子序列)

1. 题目内容
  1. 矩阵连乘问题所有不同可能结果打印: 给定一个正整数 N N N, 输出N个矩阵连乘时所有可能的计算方法。(加括号的方式)
  2. 求矩阵连乘问题最优解并打印求解线路: 给定 N N N个矩阵的规模,给出它们相乘时需要的最小乘法运算数目,并打印出连乘方式(根据解逆推加括号的方式) 。
  3. 对最长公共子序列问题(LCS)进行求解, 并给出具体的公共子序列。
  4. (选做)对于求最长公共子序列长度的问题,优化其空间复杂度。
2. 解题思路

由于这周开始我们开始学习动态规划(Dynamic Programming)算法,这个算法的核心就是状态转移方程。因此思路说明都围绕着状态转移方程进行展开。

1. 所有可能结果打印

这个小题老师在课堂上让我们分析过复杂度,以及写出递归方程。这是一个显然的分治的问题: 我们想要求一个规模为 N N N 的矩阵连乘,可以想象假设我们已经知道了某个顺序去计算整个连乘积, 那么最后一步一定是某两个矩阵相乘, 并且组成这两个矩阵的元素包含了所有这N个元素。即我们对N个元素做一个划分,分为两部分:原问题转化为划分为左侧矩阵积的种类数与右侧矩阵积的种类数。

上面这个思想我们转化为算式,就可以得到这个问题的递归方程。即:

f ( n ) = ∑ 1 k = n − 1 f ( k ) ∗ f ( n − k ) f(n) = \sum^{k=n-1}_{1}f(k) * f(n - k) f(n)=1k=n1f(k)f(nk)

这就是对于规模为 N N N的问题的解的数目。根据这个方程我们可以写出相应的递归程序把具体解求出。

这是递归的思路,然而我写这道题采用的仍然是动态规划的方法。但是其实本质的方程还是一致的。只不过是实现上的区别而已。递归分治主要依赖递归的程序结构:这种结构通常会导致开发的高效性与程序的低效性(这两者经常是拮抗出现的),而动态规划通常表现为循环实现。

首先我们来考虑, 假设我们不需要得到具体的可能结果而只需要结果的数目,那么大部分人都会采用循环解决,对于一个问题规模为 N N N的解可以在 O ( N 2 ) O(N^2) O(

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值