c语言求最长单调子序列,设计一个O(n2)时间算法,找出由n个数组成的序列的最长单调递增子序列...

这篇博客介绍了如何利用动态规划在O(n^2)的时间复杂度内找到一个n个数序列的最长单调递增子序列。作者详细解释了算法的思路,并给出了C语言实现的代码示例。

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

满意答案

dcebd7a0de6265b6ccae5ead692f1eab.png

dfjordan23

2017.10.23

dcebd7a0de6265b6ccae5ead692f1eab.png

采纳率:55%    等级:10

已帮助:466人

算法导论15.4-5 请给出一个O(n^2)时间的算法,使之能找出一个n个数的序列中最长的单调递增子序列。

这个题目是在动态规划部分,此处显然是要用到动态规划。

我们知道可以使用动态规划思想的问题的的两个重要的特征是具有最优子结构和重叠子问题。下面就来分析一下这个问题:

对于一个n个元素的序列nums,设其最长单调递增子序列为Sm(n)(m为递增子序列的长度),则对于Sm存在两种情况:

1、如果nums[n]比Sm-1的最后一个元素大,则Sm由Sm-1加nums[n]组成

2、如果nums[n]小于等于Sm-1的最后一个元素,则Sm即为Sm-1

但是这样考虑有问题,因为如果Sm-1的序列有多个,我们则应该每一个都与nums[n]考察,如果nums[n]比所有Sm-1的尾元素都小或相等,而Sm-2的序列中又存在尾元素小于nums[n]的序列,则我们应该如何选择,Sm应该是多少?

Sm-1+nums[n]、Sm-1、Sm-2+nums[n]

所以之前的分析是有问题的,在长度相同的情况下,我们优先选择包含nums[n]的序列作为Sm(n),因为每一个

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值