(算法)最长递增子序列

问题:

Given an array of N integer, find the length of the longest increasing subsequence.

For example, given [1,-5,4,5,10,-1,-5,7], the longest increasing subsequence is length 4.(1,4,510)

思路:

1、枚举

枚举数组所有的子序列,然后判断它们是否为递增子序列(回溯法)。

2、转化

将数组排序,然后找出新数组和旧数组的最长公共子序列LCS。

(关于最长公共子序列,参考:http://www.cnblogs.com/AndyJee/p/4469196.html)

3、动态规划

假设数组为A,len[i] 表示以第 i 个元素为结尾(即第i个元素为最大)的最长递增子序列的长度;

求len[i],可以先求以前面i-1个元素结尾的最长递增子序列,如果A[i]比前面A[0...i-1]中某个元素k小,那么就可以在相应的len[k]上加1,当然是最大的len[k];

详见http://blog.csdn.net/kenby/article/details/6804720

4、优化

上述方法在求len[i]的时候, 要从a[1], ... a[i-1]中找出所有比 a[i] 小的元素,而a[1], ... a[i-1]是无序的,查找速度比较慢。

引出数组 f[k] 表示长度等于k的递增子序列中最末尾的元素, 长度越长的序列,其末尾元素也越大,所以f[k]是递增的。

实例 <1, 3, 4, 2, 7>

len[1] = 1, f[1] = a[1] = 1

len[2] = 2, f[2] = a[2] = 3

len[3] = 3, f[3] = a[3] = 4

len[4] = 2, f[2] = a[4] = 2 ( 更新了f[2] )

那么,如何求len[5] 呢?

f[1] = 1, f[2] = 2, f[3] = 4, a[5] = 7,

找出末尾元素比a[5]小,而且长度最长的递增子序列,此例中,

f[3] = 4 表示长度等于3的子序列,其末尾元素为4,这个子序列的长度最长。

a[5]加上此序列形成的新序列长度为4, 然后更新f[4] = a[5] = 7,表示长度等于4的子序列,其末尾元素等于7

在上面的步骤中,找出末尾元素比a[i]小,而且长度最长的子序列,其实就是对于f[1], ...f[k], 从后往前找,第一个比a[i]小的元素就是长度最长的子序列。查找的时候可以用二分查找方法,故更快。

代码:

1、动态规划

#include <iostream>
#include <vector>
using namespace std;unsigned int LISS(const int array[], size_t length, vector<int> &result)
{unsigned int liss[length];unsigned int pre[length];for(int i=0;i<length;++i){liss[i]=1;pre[i]=i;}int k=0;int max=1;for(int i=1;i<length;++i){for(int j=0;j<i;++j){if(array[j]<array[i] && liss[j]+1>liss[i]){liss[i]=liss[j]+1;pre[i]=j;if(max<liss[i]){max=liss[i];k=i;}}}}//    i = max - 1;while(pre[k]!=k){
//        result[i--] = array[k];result.push_back(array[k]);k=pre[k];}//result[i] = array[k];result.push_back(array[k]);return max;
}int main()
{int A[]={1,-5,4,5,10,-1,-5,7};int len=sizeof(A)/sizeof(A[0]);vector<int> result;cout << LISS(A,len,result) << endl;for(int i=0;i<result.size();i++)cout<<result[i]<<' ';cout<<endl;
}

2、优化

#include <iostream>
#include <vector>
using namespace std;unsigned int LISS(const int array[], size_t length, vector<int> &result)
{unsigned int liss[length];unsigned int pre[length];unsigned int f[length];for(int i=0;i<length;++i){liss[i]=1;pre[i]=i;f[i]=0;}int k=0;int max=1;f[max]=0;for(int i=1;i<length;++i){for(int j=max;j>=1;--j){if(array[f[j]]<array[i]){liss[i]=j+1;pre[i]=f[j];if(f[liss[i]]!=0){int old=array[f[liss[i]]];if(array[i]<old)f[liss[i]]=i;}elsef[liss[i]]=i;if(max<liss[i]){max=liss[i];k=i;}break;}}}//    i = max - 1;while(pre[k]!=k){
//        result[i--] = array[k];result.push_back(array[k]);k=pre[k];}//result[i] = array[k];result.push_back(array[k]);return max;
}int main()
{int A[]={1,3,4,2,7};int len=sizeof(A)/sizeof(A[0]);vector<int> result;cout << LISS(A,len,result) << endl;for(int i=0;i<result.size();i++)cout<<result[i]<<' ';cout<<endl;
}

在线测试OJ:

http://www.nowcoder.com/questionTerminal/585d46a1447b4064b749f08c2ab9ce66

AC代码:

class AscentSequence {
public:int findLongest(vector<int> A, int n) {vector<int> dp(n);vector<int> f(n);dp[0]=1;f[0]=A[0];int left,right,mid;int count=0;int lmax=1;for(int i=1;i<n;i++){left=0;right=count;while(left<=right){mid=left+((right-left)>>1);if(A[i]>=f[mid])left=mid+1;elseright=mid-1;}f[left]=A[i];if(left>count)count=left;dp[i]=left+1;if(lmax<dp[i])lmax=dp[i];}return lmax;       }
};

 

class AscentSequence {
public:int findLongest(vector<int> A, int n) {int len=A.size();if(len<=1)return len;vector<int> mLen(n,1);int lMax=1;for(int i=1;i<n;i++){for(int j=0;j<i;j++){if(A[i]>A[j] && mLen[j]+1>mLen[i])mLen[i]=mLen[j]+1;if(mLen[i]>lMax)lMax=mLen[i];}}return lMax;}
};

转载于:https://www.cnblogs.com/AndyJee/p/4703332.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/290726.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Tensorflow】解决No module named ‘matplotlib‘/‘pandas‘

用Tensorflow出现No module named ‘matplotlib’/‘pandas’ 尝试网上方法打开终端pip install pandas 不成功&#xff0c;报一大堆红字错误。自己尝试了一种方法。 打开Anaconda Navigator&#xff1b;找到Environments&#xff0c;点击对应环境&#xff0c;我的是tensorfl…

Android之在一个类里面注册Handler发送消息在另外一个类里面接收消息

1、问题 我们要在一个类里面变量或者函数变化需要改变另外一个类里面的东西,这个时候java里面除了接口回调之外,我们还可以用注册Handler来实现 2、代码实现 1、MainActivity.java文件 package com.example.handlercallback;import android.app.Activity; import android.o…

人之将死其言也善?30年来死囚遗言分析

今天是感恩节&#xff0c;不知道这个话题合适不合适。我们经常会提到『死而无憾』这个词。这个词似乎是一种理想状态&#xff0c;几乎100%的人还是做不到的。那么我们的『憾』在哪里&#xff1f;这个问题看似不是难题&#xff0c;不过仔细想想是永远没答案的&#xff0c;人只有…

如何通过 C# 比较两幅图片的相似度?

咨询区 Byyo我在用 C# 实现一个可以查找重复图片的小工具&#xff0c;我目前是给每一个图片做一个 md5 码&#xff0c;然后通过 md5 值来判断图片是否相同。但现实情况要复杂的多&#xff0c;比如&#xff1a;图片被旋转了&#xff0c;比如&#xff1a;90图片大小不一致不同的压…

linux 命令-- touch

linux中文件元数据中有三个时间戳1.atime&#xff1a;最后一次访问时间2.mtime&#xff1a;最后一次修改文件内容的时间3.ctime&#xff1a;最后一次修改文件元数据的时间。&#xff08;最后一次改变文件状态的时间&#xff0c;上面atime 和 mtime的变化、文件权限的变化等都会…

Python easy_install

系统中有高版本的Python&#xff0c; 直接pip3 install ipcalc安装&#xff0c;都是装到高版本的Python 系统默认的Python是2.7.6&#xff0c;现在想装到默认版本中&#xff0c;可以使用easy_install yuyueworkplace:/usr/bin $ sudo easy_install ipcalcPassword:Searching f…

linux之用openssl命令Base64编码解码、md5/sha1摘要、AES/DES3加密解密

1、我们先看openssl help命令会输出什么? 2、我们用openssl命令实现字符串和文本的Base64编码和解码 openssl base64 openssl base64 -d 3、我们用openssl命令实现字符串和文本的md5/sha1摘要

陈松松:如何锁定细分领域,视频营销才更容易持续做下去

每个视频&#xff0c;都是你的金牌业务员这是我写的第33篇视频营销原创文章与其搜索十年&#xff0c;不如花一年的时间学习&#xff0c;去赚9年的高薪&#xff01;很多朋友都在探讨&#xff0c;视频营销越来越难了&#xff0c;得转行了&#xff01;我想说的是&#xff0c;自己不…

转:工作流服务Workflow Service(1):ReceiveActivity

转&#xff1a;http://www.cnblogs.com/carysun/archive/2009/01/11/receiveactivity.html 在.NET3.5中WF提供了和WCF的整合&#xff0c;就是工作流服务&#xff0c;即使用工作流创作的 WCF服务。服务协定的实现是通过一个或多个 ReceiveActivity 活动处理的。在WCF中提供了三种…

论敏捷管理与团队文化的契合度

前言说到敏捷管理&#xff0c;很多程序员或者软件开发公司的管理人员第一反应就是“小步快跑&#xff0c;频繁发布”。这令公司决策层&#xff08;老板&#xff09;觉得敏捷能解决一切问题&#xff0c;想啥时候上线就啥时候上线。其实这只是一种表象。要深刻理解敏捷的本质和内…

Echart..js插件渲染报错 data.length1?

问题 getJSON提交 返回数据正常&#xff0c;在传入参数进行序列化&#xff0c;渲染报表时报错 option.data.length < 1. 分析 1.可能情况一: . 可自己明明是getJSON()把渲染放在成功回调函数里面了&#xff0c;所以显然不是这个错误 2.可能情况二 &#xff1a; 序列化数据没…

LeetCode之Valid Parentheses

1、题目 Given a string containing just the characters (, ), {, }, [ and ], determine if the input string is valid. The brackets must close in the correct order, "()" and "()[]{}" are all valid but "(]" and "([)]" are…

《JavaScript专家编程》——第1章 对象和原型 1.1鸟瞰JavaScript

本节书摘来自异步社区《JavaScript专家编程》一书中的第1章&#xff0c;第1.1节&#xff0c;作者&#xff1a;【美】Mark Daggett&#xff08;达格特&#xff09;著&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看 第1章 对象和原型 练习不会造就完美&#xf…

c#使用PdfiumViewer展示、打印pdf文档

1:简介PdfiumViewer 是一个 WinForms 控件&#xff0c;它承载一个 PdfRenderer 控件并添加一个工具栏来保存或打印 PDF 文件2:兼容性除了常规的win7 win10 也支持xp win83:对比Spire.Pdf和Adobe PDF ReaderSpire.Pdf收费且免费版只能打印三页的pdfAdobe PDF Reader每台电脑都必…

apache 静态编译和动态编译参考

apache-2.2.22 编译安装笔记 一、静态编译 在使用./configure 编译的时候&#xff0c;即没有使用--enable-mods-shared[module]或者--enable-[module]shared这2个中的一个&#xff0c;那么所有的默认模块为静态。何谓静态&#xff1f; 其实就是编译的时候所有的模块自己编译进h…

jQuery插件ASP.NET应用之AjaxUpload

本次使用AJAXUPLOAD做为上传客户端无刷上传插件&#xff0c;其最新版本为3.9&#xff0c;官方地址&#xff1a;http://valums.com/ajax-upload/ 在页面中引入 jquery.min.1.4.2.js 和 ajaxupload.js Html代码 <script src"Scripts/jquery-1.4.2.min.js" type&quo…

LeetCode之Remove Element

1、题目 Given an array and a value, remove all instances of that value in place and return the new length. Do not allocate extra space for another array, you must do this in place with constant memory. The order of elements can be changed. It doesnt matter…

运维前线:一线运维专家的运维方法、技巧与实践导读

前  言为什么要写这本书《运维前线&#xff1a;一线运维专家的运维方法、技巧与实践》&#xff08;以下简称《运维前线》&#xff09;是前线系列的一个子集&#xff0c;前线系列图书的出版理念是邀请多位业界专家&#xff0c;总结所在行业的最新理念或深度实践经验。前线系列…

Avalonia跨平台入门第十一篇之自定义Window

在前面分享的几篇中咱已经玩耍了Popup、ListBox多选、Grid动态分、RadioButton模板、控件的拖放效果、控件的置顶和置底、控件的锁定;今天趁着周末接着去摸索自定义Window样式,毕竟自带的样式不太让人满意;最终实现的效果如下图:前台Window样式:后台Window代码:咱也基于AvalonS…

开发文档收集

http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html_single/ http://docs.jboss.org/hibernate/orm/4.1/devguide/en-US/html_single 转载于:https://www.cnblogs.com/happyday56/p/4709045.html