最长递增子序列(Longest Increasing Subsequence)-C语言实现

动态规划解析:最长递增子序列(LIS)问题
文章介绍了最长递增子序列问题,这是一个经典的动态规划问题。通过CRCC方法分析了问题的结构,提出递归定义和计算最优化问题的值。文中提供了递归和迭代两种解决方案,并强调在某些情况下迭代可能是更优的选择。最后,文章指出动态规划在解决子问题剪枝时的高效性。

最长递增子序列(Longest Increasing Subsequence)

  1. 前言

最长递增子序列属于经典的动态规划问题,属于约束条件下求最大子集的问题。这里的约束条件意思是,子序列需要严格按照递增条件产生,在这个前提之下,我们要求到最长的子序列。这类问题的衍生问题有很多,其本质都是穷举最大化子集。

  1. 问题描述

问题其实非常简单,给你一个整数数组 arr ,找到其中最长严格递增子序列的长度。我们任意提取数组中的元素,元素下标有:
i k < i j < i l < i m i_k<i_j<i_l<i_m ik<ij<il<im
如果对应的值严格递增(不包括等于),
a r r [ i k ] < a r r [ i j ] < a r r [ i l ] < a r r [ i m ] arr[i_k]<arr[i_j]<arr[i_l]<arr[i_m] arr[ik]<arr[ij]<arr[il]<arr[im]
那么此子序列就是递增的子序列,其长度为4。

如果考虑最长递增子序列,那么就要穷举数组中的所有子序列,然后找到最大值。

  1. 求解过程

为了深入学习动态规划的基本思维,我们坚持采用《算法导论》中的 CRCC方法对其进行分析,以便后续不断提升动态规划算法思维。求解动态规划框架分为四步。

a.) 表征优化问题的结构(Characterized the structure of the optimal solution)

首先给出例子,帮助理解整体的过程,

在这里插入图片描述

如果求出以index=6结尾的数组的最长递增子序列,那么我们可以遍历index=6之前所有元素,如果此元素小于6号元素的值,那么仅需把此元素处的LIS的值递增1即可,最后比较所有的可能。如果用图的术语解释,就是需要找到元素单调递增的最长路径(权值为1)。

在这里插入图片描述

如果需要计算以index=6为尾部的LIS值,可以用公式求解:
L I S [ 6 ] = m a x { L I S [ 2 ] , L I S [ 3 ] + 1 , L I S [ 4 ] + 1 } = m a x { 1 , 3 , 3 } ; LIS[6]=max\{LIS[2],LIS[3]+1,LIS[4]+1\}=max\{1,3,3\}; LIS[6]=ma

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值