最长递增子序列


对于这个问题分别写了两种实现方法,一种为n2,一种为n*log(n),由于能力有限暂时还无法在n*log(n)时间里找出这个最短序列。


n2:一个简单的dp的问题;


n*log(n):

  • 建立一个辅助数组array,依次读取数组元素 x 与数组末尾元素 top比较: 
    • 如果 x > top,将 x 放到数组末尾;
    • 如果 x < top,则二分查找数组中第一个 大于等于x 的数,并用 x 替换它。

遍历结束之后,最长递增序列长度即为栈的大小

注意c数组的下标代表的是子序列的长度,c数组中的值也是按递增顺序排列的。这才可能用二分查找。

数组array[i]存储的是子序列长度为i的序列最后一个值(该值是该子序列中最大的元素;如果长度为i的序列有多个,那么array[i]存放这类序列最后元素中的最小一个)。

推荐一个博客:http://blog.csdn.net/u013074465/article/details/45442067

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
#include<vector>
#include<stack>
#include<map>
#include<string>
#include<set>
#include<list>
#include<functional>
#include<stdlib.h>
#define INF 0x3f3f3f3f
#define mem(a,n) memset(a,n,sizeof(n))
#define PI 3.1415926
using namespace std;
typedef long long ll;
const int mod=1e9+7;
ll inv(ll b){return b==1?1:(mod-mod/b)*inv(mod%b)%mod;}

void longest_increasing_subsequence1(){
	int a[1005],n,maxx,dp[1005];
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		dp[i]=1;
	}
	maxx=0;
	for(int i=1;i<=n;i++){
		for(int j=1;j<i;j++){
			if(a[i]>a[j])//不要求完全递增可改为>= 
				dp[i]=max(dp[i],dp[j]+1);
		}
		maxx=max(maxx,dp[i]);
	}	
	printf("%d\n",maxx);
}


void longest_increasing_subsequence2(){
/*
例一:原序列为1,5,8,3,6,7 
辅助数组为1,5,8,此时读到3,用3替换5,得到1,3,8; 再读6,用6替换8,得到1,3,6;再读7,得到最终栈为1,3,6,7。最长递增子序列为长度4。
例二:原序列为1,5,8,3 
则最栈辅助数组为1,3,8。明显这不是最长递增子序列!
*/
	int a[1005],n,maxx;
	vector<int> array;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	for(int i=1;i<=n;i++){
		if(array.size()==0||array.back()<a[i]){
			
			array.push_back(a[i]);
		}//
		else{
			int low=0,high=array.size()-1;
			int mid;
			while(low<high){
				mid=(low+high)/2;
				if(a[i]>array[mid])
					low=mid+1;
				else
					high=mid-1;
			}
			array[low]=a[i];	
		}
	}
	printf("%d ",array.size());
}
int main()
{
	longest_increasing_subsequence1();//n2
	longest_increasing_subsequence2();//n*log(n)
	return 0; 
}
 


基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip 个人大四的毕业设计、课程设计、作业、经导师指导并认可通过的高分设计项目,评审平均分达96.5分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 [资源说明] 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设或者课设、作业,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96.5分,放心下载使用! 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),供学习参考。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值