• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > 求数组中最长递增子序列的解决方法

求数组中最长递增子序列的解决方法

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了数组序列化,php 数组序列化,java数组序列化,js数组序列化,json数组序列化等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
存储扩展算法n2编程c 写一个时间复杂度尽可能低的程序,求一个一维数组(N个元素)中的最长递增子序列的长度。
例如:在序列1,-1,2,-3,4,-5,6,-7中,其最长的递增子序列为1,2,4,6 或者 -1,2,4,6。(编程之美P198-202)
分析与解法
根据题目的要求,求一维数组中的最长递增子序列,也就是找一个标号的序列b[0],b[1],…,b[m](0 <= b[0] < b[1] < … < b[m] < N),使得array[b[0]]<array[b[1]]<…<array[b[m]]。

解法一
根据无后效性的定义我们知道,将各阶段按照一定的次序排列好之后,对于某个给定的阶段状态来说,它以前各阶段的状态无法直接影响它未来的决策,而只能间接地通过当前的这个状态来影响。换句话说,每个状态都是历史的一个完整总结。
同样的,仍以序列1,-1,2,-3,4,-5,6,-7为例,我们在找到4之后,并不关心4之前的两个值具体是怎样,因为它对找到6没有直接影响。因此,这个问题满足无后效性,可以通过使用动态规划来解决。
可以通过数字的规律来分析目标串:1,-1,2,-3,4,-5,6,-7。
使用i来表示当前遍历的位置
当i=1时,显然,最长的递增序列为(1),序列长度为1.
当i=2是,由于-1<1。因此,必须丢弃第一个值后重新建立串。当前的递增序列为(-1),长度为1。
当i=3时,由于2>1,2>-1。因此,最长的递增序列为(1,2),(-1,2),长度为2。在这里,2前面是1还是-1对求出后面的递增序列没有直接影响。(但是在其它情况下可能有影响)
依此类推之后,我们得出如下的结论。
假设在目标数组array[]的前i个元素中,最长递增子序列的长度为LIS[i]。那么,
LIS[i+1]=max{1,LIS[k]+1},  array[i+1]>array[k],  for any k <= i
即如果array[i+1]大于array[k],那么第i+1个元素可以接在LIS[k]长的子序列后面构成一个更长的子序列。于此同时array[i+1]本身至少可以构成一个长度为1的子序列。
根据上面的分析,就可以得到代码清单:
C++代码:
</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 求数组中最长递增子序列的解决方法

相关文章

  • 2017-05-28C和MFC巧妙获取外网IP的两种实现方法
  • 2017-05-28C语言的递归思想实例分析
  • 2017-05-28C语言中的回调函数实例
  • 2017-05-28将CString字符串输入转化成整数的实现方法
  • 2017-05-28c语言调用汇编的方法
  • 2017-05-28c++ int转string方法
  • 2017-05-28C++获得本机所有网卡的IP和MAC地址信息的实现方法
  • 2017-05-28C++ 二叉搜索树(BST)的实现方法
  • 2017-05-28使用C语言递归与非递归实现字符串反转函数char *reverse(char *str)的方法
  • 2017-05-28C语言冒泡排序法心得

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 解读堆排序算法及用C++实现基于最大堆的堆排序示例
    • 基于malloc与free函数的实现代码及分析
    • C++ 字符串的反转五种方法实例
    • 最小生成树算法C语言代码实例
    • DHCP:解析开发板上动态获取ip的2种实现方法详解
    • C++ 中placement new 操作符使用方法
    • C语言中操作utmp文件的相关函数用法
    • C++中图片重命名实现代码
    • 简单实现C++复数计算器
    • C++中的类型转换static_cast、dynamic_cast、const_cast和reinterpret_cast总结

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有